Un script tiene varios pasos, voy mandando mensajes de lo que se está realizando y en algunas tareas me interesa mostrar la salida que da el comando al que llamo.
La página de log en tiempo real nos muestra cuatro espacios con informaciones diferentes. Los mensajes de log del script se van acumulando en la zona intermedia y la salida del comando se muestra en la parte baja.
Cada una de las zonas toma como punto de partida un archivo de log que se guarda en el directorio /tmp del cliente. Nos interesan las dos últimas.
Archivo | Variable | Zona |
---|---|---|
/tmp/session.log | OGLOGSESSION | Pasos del script |
/tmp/command.log | OGLOGCOMMAND | Salida comando. |
Además tenemos:
Archivo | Variable | Función |
---|---|---|
/opt/opengnsys/log/IP_client.log | OGLOGFILE | Archivo de log histórico que guarda el servidor |
/tmp/command.log.tmp | -- | Se obtiene aplicando el comando string a command.log |
Las funciones ogEcho y ogRaiseError permiten escribir en los archivos log del cliente, session.log y command.log. El formato es:
ogEcho [log] [session] [command] "cadena a mostrar"
ogRaiserError [session] [command] "cadena a mostrar"
Los mensajes se escribirán en la ventana de línea de comandos y en los archivos indicados por los parámetros. El comando ogRaiserError siempre va a escribir en el archivo de log del cliente.
El comando ogEcho admite varios niveles de log: info, warning y error. Si los utilizamos antes de la cadena que queramos mostrar se informará de la hora y del nivel de error. Por ejemplo:
> ogEcho session info "mensaje de info"
OpenGnSys info: 2014-03-18 12:42:15 mensaje de info
En general los mensajes que informen de las tareas que se están realizando y de los errores que nos hacen salir de la aplicación se mostrará en los mensajes de log y en la parte intermedia de la pantalla.
Los mensajes que contengan comandos o valores como la ip del repositorio y los nombres de la imágenes sólo se mostrará en línea de comandos y si se quiere en el archivo de log del cliente.
Al comenzar un script borramos los archivos que se muestra en la pantalla.
En el caso que un script sea una subtarea que es llamada por otro script, conviene no borrar el script session.log. Por ejemplo si el script de deployImage llama a updateCache no me interesa borrar los pasos que se hayan hecho anteriormente pero sí la salida concreta del comando. En el código tendré:
# Limpia los ficheros temporales usados como log de seguimiento para httpdlog
echo " " > $OGLOGCOMMAND
[ "$(ogGetCaller)" == "deployImage" ] || echo -n "" > $OGLOGSESSION;
Los mensajes que quiero que salgan en la parte de los intermedia los mostraré así:
ogEcho log session “Mensaje de log”
La salida de los comandos se redireccionan así:
ogCopyFile REPO imagen.img CACHE / 2>&1 | tee -a $OGLOGCOMMAND
Si quisiera comprobar si el comando ha dado error y salirme despues.
ogCopyFile REPO imagen.img CACHE / 2>&1 | tee -a $OGLOGCOMMAND
[ ${PIPESTATUS[0]} == 0 ] || exit $(ogRaiseError session $OG_ERR_XXX "parametros" || echo $?)
Los errores definidos en opengnsys los podemos encontrar en /opt/opengnsys/client/etc/preinit/loadenviron.sh. Si queremos ver el mensaje que corresponde a un código de error podemos usar la función ogRaiseError:
> echo $OG_ERR_UPDATECACHE
31
> ogRaiseError 31
OpenGnSys error: 2014-03-18 13:25:37 : Error al realizar el comando updateCache ""
No conviene redireccionar hacía OGLOGCOMMAND la salida de los comandos/script que en su codigo interno envíen mensajes a OGLOGSESSION, para no duplicar los mensajes. Por ejemplo su desde el script deployImage llamo a updateCache y lo redirecciono a la salida de comandos.
updateCache 2>&1 | tee -a $OGLOGCOMMAND
Como update cache en su codigo interno manda mensajes a OGLOGSESSION estos se verán duplicados en las dos partes de la pantalla.
La página del cliente que se encarga de mostrar el log de tiempo real es: /usr/lib/cgi-bin/httpd-log.sh.
#!/bin/bash
echo "Content-type: text/html"
echo ""
#echo "<html><head><meta http-equiv='Refresh' content='2,URL=./example3.sh'><title>Bash as CGI"
echo "<html><head><title>OpenGnsys Client</title></head><body>"
echo "<h1> $(./httpd-runengine.sh 'ogEcho $MSG_HTTPLOG_NOUSE' ) .</br>host $(hostname -s)</h1> "
echo "<IFRAME SRC='bandwidth.sh' WIDTH=250 HEIGHT=90> <A HREF="bandwidth.sh">link</A> </IFRAME> "
echo "<IFRAME SRC='cache.sh' WIDTH=590 HEIGHT=90><A HREF="cache.sh">link</a> </IFRAME><br>"
echo "<IFRAME SRC='LogSession.sh' WIDTH=850 HEIGHT=230> <A HREF="LogSession.sh">link</A> </IFRAME>"
echo "<IFRAME SRC='LogCommand.sh' WIDTH=850 HEIGHT=280> <A HREF="LogCommand.sh">link</A> </IFRAME>"
De las distintas partes de la pantalla se encargan los script:
En el repositorio los encontramos en el directorio /opt/opengnsys/client/lib/httpd.
Mostramos las líneas de estos script que nos pueden interesar:
<meta http-equiv='Refresh' content='11,URL=./bandwidth.sh'>
echo " DISK || NET "
echo "Read:Write || Recv:Send "
echo $(tail -n1 /tmp/bandwidth)
$(ls -lh /opt/opengnsys/cache/opt/opengnsys/images )"
<meta http-equiv='Refresh' content='5,URL=./LogSession.sh'>
echo "$(cat /tmp/session.log | uniq )"
$(strings /tmp/command.log > /tmp/command.log.tmp)
...
NAME='trackloghead'
echo "$(egrep -v '%|sent|^Elapsed:\|^Total [Tt]ime:\|^-\|^|\|^bytes\|^\[' /tmp/command.log.tmp | uniq | head -n 15)"
...
NAME='tracklogtail'
echo "$(egrep '%|sent|^Elapsed:\|^Total [Tt]ime:\|^-\|^|\|^bytes' /tmp/command.log.tmp | uniq | tail -n 2)"
Observamos que para mostrar la progresión del comando se filtra su salida con egrep, si algún comando no mostrará nada habría que revisar los patrones que se le pasan.