2 | | La página de log en tiempo real nos muestra cuatro espacios con informaciones diferentes: |
| 2 | 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. |
| 3 | |
| 4 | 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. |
| 5 | |
| 6 | [[Image(logTiempoReal.png)]] |
| 7 | |
| 8 | 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. |
| 9 | |
| 10 | || Archivo || Variable || Zona || |
| 11 | || /tmp/session.log || OGLOGSESSION || Pasos del script || |
| 12 | || /tmp/command.log || OGLOGCOMMAND || Salida comando. || |
| 13 | |
| 14 | Además tenemos: |
| 15 | |
| 16 | || Archivo || Variable || Función || |
| 17 | || /opt/opengnsys/log/IP_client.log || OGLOGFILE || Archivo de log histórico que guarda el servidor || |
| 18 | || /tmp/command.log.tmp || -- || Se obtiene aplicando el comando string a command.log || |
| 19 | |
| 20 | Al comenzar un script borramos los archivos que se muestra en la pantalla. |
| 21 | |
| 22 | 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é: |
| 23 | |
| 24 | {{{ |
| 25 | # Limpia los ficheros temporales usados como log de seguimiento para httpdlog |
| 26 | echo " " > $OGLOGCOMMAND |
| 27 | [ "$(ogGetCaller)" == "deployImage" ] || echo -n "" > $OGLOGSESSION; |
| 28 | }}} |
| 29 | |
| 30 | Los mensajes que quiero que salgan en la parte de los intermedia los monstraré así: |
| 31 | {{{ |
| 32 | echo “Mensaje de log” | tee -a $OGLOGSESSION $OGLOGFILE |
| 33 | }}} |
| 34 | La salida de los comandos se redireccionan así: |
| 35 | |
| 36 | {{{ |
| 37 | ogCopyFile REPO imagen.img CACHE / 2>&1 | tee -a $OGLOGCOMMAND |
| 38 | }}} |
| 39 | |
| 40 | Cuando quiero mostrar la salida de un error y salirme después: |
| 41 | {{{ |
| 42 | ComandoAComprobar |
| 43 | [ $? == 0 ] || ogRaiseError $OG_ERR_XXX "paramentros" 2>&1 | tee -a $OGLOGSESSION $OGLOGFILE |
| 44 | exit ${PIPESTATUS[0]} |
| 45 | }}} |
| 46 | |
| 47 | Los errores definidos en opengnsys los podemos encontrar en /opt/opengnsys/client/etc/preinit/loadenviron.sh |
| 48 | |
| 49 | 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. |
| 50 | {{{ |
| 51 | updateCache 2>&1 | tee -a $OGLOGCOMMAND |
| 52 | }}} |
| 53 | Como update cache en su codigo interno manda mensajes a OGLOGSESSION estos se verán duplicados en las dos partes de la pantalla. |
| 54 | |
| 55 | == Código de la página de log en tiempo real. == |
| 56 | La página del cliente que se encarga de mostrar el log de tiempo real es: /usr/lib/cgi-bin/httpd-log.sh |
| 57 | |
| 58 | {{{ |
| 59 | #!/bin/bash |
| 60 | echo "Content-type: text/html" |
| 61 | echo "" |
| 62 | #echo "<html><head><meta http-equiv='Refresh' content='2,URL=./example3.sh'><title>Bash as CGI" |
| 63 | echo "<html><head><title>OpenGnsys Client</title></head><body>" |
| 64 | |
| 65 | echo "<h1> $(./httpd-runengine.sh 'ogEcho $MSG_HTTPLOG_NOUSE' ) .</br>host $(hostname -s)</h1> " |
| 66 | |
| 67 | echo "<IFRAME SRC='bandwidth.sh' WIDTH=250 HEIGHT=90> <A HREF="bandwidth.sh">link</A> </IFRAME> " |
| 68 | echo "<IFRAME SRC='cache.sh' WIDTH=590 HEIGHT=90><A HREF="cache.sh">link</a> </IFRAME><br>" |
| 69 | |
| 70 | echo "<IFRAME SRC='LogSession.sh' WIDTH=850 HEIGHT=230> <A HREF="LogSession.sh">link</A> </IFRAME>" |
| 71 | echo "<IFRAME SRC='LogCommand.sh' WIDTH=850 HEIGHT=280> <A HREF="LogCommand.sh">link</A> </IFRAME>" |
| 72 | }}} |
| 73 | |
| 74 | De las distintas partes de la pantalla se encargan los script: |
| 75 | * http://$IP_cliente/cgi-bin/bandwidth.sh |
| 76 | * http://$IP_cliente/cgi-bin/cache.sh |
| 77 | * http://$IP_cliente/cgi-bin/LogSession.sh |
| 78 | * http://$IP_cliente/cgi-bin/LogCommand.sh |
| 79 | |
| 80 | Mostramos las líneas de estos script que nos pueden interesar: |
| 81 | |
| 82 | '''bandwidth.sh''' |
| 83 | {{{ |
| 84 | <meta http-equiv='Refresh' content='11,URL=./bandwidth.sh'> |
| 85 | echo " DISK || NET " |
| 86 | echo "Read:Write || Recv:Send " |
| 87 | echo $(tail -n1 /tmp/bandwidth) |
| 88 | }}} |
| 89 | |
| 90 | '''cache.sh''' |
| 91 | {{{ |
| 92 | $(ls -lh /opt/opengnsys/cache/opt/opengnsys/images )" |
| 93 | }}} |
| 94 | |
| 95 | '''!LogSession.sh''' |
| 96 | {{{ |
| 97 | <meta http-equiv='Refresh' content='5,URL=./LogSession.sh'> |
| 98 | echo "$(cat /tmp/session.log | uniq )" |
| 99 | }}} |
| 100 | |
| 101 | '''!LogCommand.sh''' |
| 102 | {{{ |
| 103 | $(strings /tmp/command.log > /tmp/command.log.tmp) |
| 104 | ... |
| 105 | NAME='trackloghead' |
| 106 | echo "$(egrep -v '%|sent|^Elapsed:\|^Total [Tt]ime:\|^-\|^|\|^bytes\|^\[' /tmp/command.log.tmp | uniq | head -n 15)" |
| 107 | ... |
| 108 | NAME='tracklogtail' |
| 109 | echo "$(egrep '%|sent|^Elapsed:\|^Total [Tt]ime:\|^-\|^|\|^bytes' /tmp/command.log.tmp | uniq | tail -n 2)" |
| 110 | }}} |
| 111 | |
| 112 | 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. |
| 113 | |
| 114 | |
| 115 | |