sábado, 10 de octubre de 2009

Creando un log

Debido a que nuestro shell script "charging" se ejecuta al ser llamado por nuestro awk "lee_conf.awk", este será ejecutado y cerrado tantas veces como políticas correctas existan en el fichero de configuración. Esto supone un problema, ya que deberemos guardar datos de ejecuciones anteriores, para las nuevas ejecuciones de nuestro shell script. Actualmente el dato que necesitamos guardar es el espacio libre en cache después de cachear los diferentes archivos, una forma guardar este valor es hacerlo en un fichero. Ya que tenemos que generar este fichero de texto con este dato, es una buena opción aprovecharlo para hacer un log de la ejecución de nuestro programa, así que a parte de escribir y leer datos en él para su posterior uso, introduciremos datos que resultarán útiles de cara al usuario final.
Los datos que inicialmente hemos decidido introducir son:
Espacio libre inicial en cache (Lo usaremos en nuestro script).
Número de política aplicada.
Ficheros cacheados en cada politica.
Total tamaño de ficheros cacheados para cada política.
Espacio libre en cache después de cachear todos los ficheros de todas las políticas aplicadas.

Añadiendo Loglevel

Hemos añadido a nuestro shell script "charging" una variable llamado loglevel. Esta variable podrá tener valores del 1 al 4, donde 1 representará un bajo nivel de loglevel, y el 4 el mas alto nivel de loglevel.

El loglevel nos servirá para especificar el nivel de salidas por pantalla queremos en nuestro programa, es decir especificando un 4, en la salida por pantalla de nuestro programa mostrará todos los mensajes del programa y que esta haciendo en todo momento, en cambio si especificamos un 1, nuestro programa mostrará el mínimo de mensajes por pantalla mientras se ejecute, y solo mostrará los eventos mas importantes, como cuando se haya ocupado el tamaño máximo de cache y no se pueda seguir cacheando. Para realizar esto hemos añadido condicionales a cada uno de los "printf" y "echo" que salian por pantalla, y dependiendo el grado de importancia que creemos que tienen se ejecutarán si su loglevel cumple la condición de ser igual o mas grande que el loglevel especificado en la variable inicial.

Fallo en crontab

Tal y como comentábamos en el anterior post, la tarea crontab no se ejecutaba de forma correcta, después de hacer diferentes búsquedas, comprobar variables de entorno, etc, creamos un log con la ejecucion de la tarea desde crontab, y nos muestra donde estaba nuestro error, la instrucción que llama a nuestro shell script dentro del código de awk no tenia el path especificado, y no encontraba el fichero, con esto solucionado la tarea se ejecuta correctamente.

Ahora nos faltará solucionar otro problema, en caso que el usuario desee introducir algún asterisco en alguno de los cinco parámetros del momento de ejecución de la tarea, nuestro script no entiende el asterisco como un literal, sino como una expresión regular, una posible solución seria comprobar si los parámetros son asteriscos y modificarlos por rangos 0-59, etc.

Aparcamos este problema de momento, ya que creemos que esa solución deberia funcionar, y lo retomaremos en su momento.

martes, 6 de octubre de 2009

Modificaciones en fichero de configuración(3) Asignando periocidad a crontab

También vamos a modificar nuestro fichero de configuración para que el usuario pueda asignar la tarea de ejecutar nuestro programa con la periocidad que el elija.

Utilizamos la misma nomenclatura que crontab.

crontab=* * * * *

Lo leemos con nuestro fichero lee_conf.awk y asignamos a las variables correspondientes.

Actualmente no tenemos esta parte funcionando correctamente, ya que tenemos un problema a la hora de ejecutar el programa awk con crontab, estamos consultando en los foros en busca del posible problema y solución.

Una vez solucionado nuestro programa realizará correctamente la tarea programada, y solo nos faltará depurar un poco mas nuestro fichero de configuración y el programa para su lectura.

Modificaciones en fichero de configuración(2) Asignado tamaño de la cache

De nuevo vamos a realizar modificaciones en nuestro fichero de configuración, esta vez el usuario podrá especificar en tal fichero si desea asignar un tamaño fijo de cache en vez de usar el espacio libre en disco.
Encontraremos una entrada del estilo: cache_size=1000M
El usuario debera especificar un número y una unidad de tamaño, nuestro programa de lectura de configuración encontrará esta entrada y trabajara con ella para enviar los datos necesarios a nuestro script "charging" que será el que se dedique a realizar todas las acciones necesarias para el caching.

Debido a estas modificaciones, hemos tenido que adecuar nuestro programa de caching "charging" para que contemplará la comentada doble posibilidad, que el tamaño de la cache fuera la asignada por el usuario o que sea el espacio en libre en disco. Nuestro script comprobará si el fichero de lectura de configuración le pasa las variables correspondientes al tamaño de la cache, en caso de que no se pasen trabajará con el tamaño libre en disco

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.