wiki:PaginaInicio

Version 4 (modified by trac, 2 years ago) (diff)

--

Páginas de Inicio

Nota: Es una primera versión, hay todavía muchas cosas que mejorar.

Al arrancar el cliente queremos que se muestre una página de inicio parecida a Rembo, es decir:

  • una página web con una serie de enlaces que nos permitan realizar distintas tareas, básicamente arrancar y restaurar distintos sistemas.
  • que permita incluir funciones personalizadas que llamen a los script de EAC.

Lo haremos utilizando en los clientes un navegador que llame al servidor web local, permitiendo que ejecute shell script a través de cgi y teniendo como usuario que arranca el servicio al root para que pueda ejecutar los script con todos los privilegios.

Nota: el navegador no puede llamar al servicio web del servidor EAC ya que los comandos se ejecutan en el equipo que corra el servicio web, es decir se ejecutarían en el servidor de EAC.

Configuración del servicio web del cliente

Iniciando el servicio como root

En el archivo /var/EAC/nfsroot/stable/etc/lighttpd/lighttpd.conf comentamos las líneas siguientes:

## change uid to <uid> (default: don't care)
#server.username            = "www-data"

## change uid to <uid> (default: don't care)
#server.groupname           = "www-data"

Activando el modulo cgi

Entramos en una shell del servidor EAC y montamos la imagen de arranque de los clientes con la función:

MountChrootEACclient

Ejecutamos el comando que activa el modulo cgi y nos salimos:

lighty-enable-mod cgi
UmountChrootEACclient

Configurando del modulo cgi (es provisional). El contenido del archivo /var/EAC/nfsroot/stable/etc/lighttpd/conf-available/10-cgi.conf sólo son dos opciones.

1. Cargando el módulo cgi:

server.modules  += ( "mod_cgi" )

2. Defino qué archivos tienen que ser interpretados por el servidor web como cgi. Dos posibilidades:

  • Solo el archivo /var/www/exec
cgi.assign      = ( "exec" => "/bin/bash" ) 
  • Todos los script situados en el dir /var/www/ (si las páginas de inicio también son cgi)
$HTTP["url"] =~ "^/" {
        cgi.assign = ( "" => "/bin/bash" )
}

En el segundo caso todo se ejecutaría a través de bash, si fuera html normal se mostraría en blanco

Script cgi y páginas de inicio

Los comandos se van a ejecutar siempre con el cgi exec. Las páginas de inicio tendrán enlaces que apunten este script y le pasen como parámetros el comando que queremos ejecutar y archivos que contengan funciones además de las EAC o Hidra.

El formato de los enlaces debería ser

http://localhost/exec?comando con argumentos&lib=path_lib1&lib=path_lib2...

Simplificaremos esto incluyendo funciones que generen el enlace.

Script exec

  • Carga funciones hidra-EAC
  • Trata la url sustituyendo %20 (espacio en blanco) y %22 (comillas dobles)
  • Carga las librerías pasadas en url.
  • Ejecuta el comando pasado en url.
#!/bin/sh

echo Content-type: text/html
echo

/bin/echo '<pre>'
source /var/EAC/hidra/scripts/hidraEnviron

RESTO=`/bin/echo "$QUERY_STRING"| /bin/sed s/"%20"/" "/g|/bin/sed s/"%22"//g`
#RESTO=`/bin/echo "$QUERY_STRING"| /bin/sed s/"%20"/" "/g|/bin/sed s/"%22"/"\""/g`
COMANDO=${RESTO%%&*}

# Solo cargamos las librerias si el comando no pertenece a hidra ni a eac
# lo reconozco porque el comando type devolvera un error
if ! `type -t $COMANDO > /dev/null`
then
   # Incluimos las librerias de las pagina de incio
   # Analizamos la cadena, bucle hasta que no contenga ningun &
   until [ $RESTO == ${RESTO%&*} ]
   do
        LIB_AUX=${RESTO%%&*}
        if `ls ${LIB_AUX#lib=} > /dev/null`
        then
           source ${LIB_AUX#lib=}
        fi

        RESTO=${RESTO#*&}

   done
   if `ls ${RESTO#lib=} > /dev/null`
   then
        source ${RESTO#lib=}
   fi
fi

$COMANDO

/bin/echo '</pre>'

Mejoras:

  • Que el path de hidraEnviron lo tome de la configuración
  • La sustitución de las dobles comillas está poco probada

Páginas de inicio

Tenemos varias opciones:

  • html puro: no permiten incluir librerías de funciones, pero son sencillas
  • shell script con html (cgi). Un poco más feas pero funcionan con el navegador en modo texto (links2)
  • javascript con html: permiten incluir librerías y son fáciles, pero necesitaríamos conseguir un navegador en modo texto que permitiera javascript

Pasamos a poner un ejemplo de cada:

html puro

Las páginas de inicio si no quisieramos incluir funciones en ellas.

Formato enlace: href='exec?hidraListPartitions 1'

<html>
<head>
<title>Pagina de inicio</title>
</head>
<body>

<p><a href='exec?hidraListPartitions 1'>Listar particiones</a></p>
<p><a href='exec?hidraBoot 1 1'>Arrancar XP</a></p>
<p><a href='exec?hidraBoot 1 2'>Arrancar Ubuntu</a></p>
<p><a href='exec?hidraPoweroff'>Apagar equipo</a></p>


</body>
</html>

shell script con html (cgi)

Formato enlace: href='exec?hidraBoot 1 1$LIB'

Formato inclusión de una librería: include path_lib

#!/bin/sh

echo Content-type: text/html
echo

# Para incluir las librerias que queramos.
LIB=""
function include (){
        if `ls $1 > /dev/null`
        then
                LIB=$LIB\&$1
        fi
}

include /var/www/include
include /var/www/include2


/bin/cat << EOF
<html>
<head>
<title>Pagina de inicio</title>
</head>
<body>

<p><a href='exec?hidraListPartitions 1$LIB'>Listar particiones</a></p>
<p><a href='exec?hidraBoot 1 1$LIB'>Arrancar XP</a></p>
<p><a href='exec?hidraBoot 1 2$LIB'>Arrancar Ubuntu</a></p>
<p><a href='exec?hidraPoweroff$LIB'>Apagar equipo</a></p>
<p><a href='exec?adios "prueba"$LIB'>Adios</a></p>


</body>
</html>
EOF

javascript con html

Las funciones de javascript las tenemos en un archivo aparte: /var/www/utils.js

Formato enlace: href='hidraListPartitions 1'

Formato inclusión de una librería: include("/var/www/include");

<html>
<head>
<script src="utils.js" type="text/javascript"></script>
<script>
// Ejemplo de librerias incluidas
include("/var/www/include");
include("/var/www/include2");
</script>

</head>
<body>

<!-- Ejemplo de tres tipos de enlaces -->
<p><a href='hola'>hola funcion incluida en /var/www/include2</a></p>
<p><a href='hidraListPartitions 1'>Listar particiones con hidra</a></p>
<p><a href='ListPartitions 1'>Listar particiones con eac</a></p>
<p><a href='hidraBoot 1 2'>Arrancar partition2 con hidra</a></p>


</body>
</html>

Script utils.js

// Las funciones window.onload, link e include sirven para que podamos tener
// funciones tipo shell script que incluiramoe en la p?gina de inicio con
// include("path_al_fichero");

// Todos los enlaces le definimos el evento onclick que llame a la funcion link
window.onload = function() {
  for(i=0;i<document.links.length;i=i+1)
    document.links[i].onclick = link;
}

// Modifica la url del enlace haciendo que incluya las archivos que queramos
// quedando la url como: exec?url_inicial&lib=Archivo1&lib=Archivo2
function link() {
  aux=this.pathname.substring(1,this.pathname.length)
  for (i=0;i<librerias.length;i=i+1)
      aux=aux+"&lib="+librerias[i];

  this.href='exec?'+aux;
  //alert(this.href);
}

// Incluye las path de los archivos que queramos en un array que luego utilizara
// la funcion link
librerias = new Array();
function include(libreria){
   librerias.push(libreria);
}

Mejora: En vez de usar un array en la función include directamente crear la cadena que queremos unir al enlace

Abriendo el navegador en los clientes

Para que al arrancar los clientes se abra el navegador llamando al servicio web local al final del archivo /var/EAC/nfsroot/stable/etc/rc.local incluimos la línea:

links2 -g -driver svgalib -mode 1024x768x64K http://localhost/$pagInicio

El navegador se ejecuta en modo texto llamando al dispositivo gráfico tipo framebuffer.

Nota: Si queremos abrir el navegador desde el usuario eac no podremos porque el home es de sólo lectura y no puede guardar los archivos temporales.

Falta: Si abrimos el navegador después de iniciar la sesión como root ocupa la pantalla completa, si lo abrimos desde el rc.local no. Hay que ver qué cambia en las variables de entorno para que se abra bien.

Falta: Si el alumno cierra el navegador el equipo debe apagarse.