"Después del juego es antes del juego"
Sepp Herberger

viernes, 23 de febrero de 2024

Cada alumno con su portátil

En mi centro muchos portátiles tienen uno o dos alumnos asignados, de tal manera que solo deberían ser usados por ellos. Esto tiene como consecuencia que no suelan sufrir desperfectos ya que al ser nominativos se incentiva su cuidado.

Pero este curso, no sé por que motivo, nos hemos encontrado en que los alumnos estaban usando los portátiles de forma libre, cogiendo el de sus compañeros al azar. Me han pedido que controlemos eso, evitando que nadie pueda usar un portátil que no sea el que tiene asignado. Está es la solución que he implementado.

Por un lado un script que se ejecuta al inicio de la sesión de usuario con:
# cat /etc/xdg/autostart/CheckUser.desktop                                                                
#!/usr/bin/env xdg-open
[Desktop Entry]
Version=1.0
Type=Application
Terminal=false
Icon[es_ES]=
Exec=/usr/local/bin/check_user
Name[es_ES]=Check authorized user
Name=Check authorized user
El script sería:
# cat /usr/local/bin/check_user
#!/bin/bash

usuario=$USER
equipo=$HOSTNAME
fecha=$(date)
file=/var/cache/.asignaciones.txt

#Si no hay fichero de asignaciones, salimos
test -e "$file" || exit 0

#Buscamos usuarios permitidos
permitidos=$(grep "^${equipo};" $file| cut -d";" -f3)

#Si no hay usuarios asignados, permitimos que lo use cualquiera
test -z "$permitidos"  &&  exit 0
test "$permitidos" == "-"  && exit 0

#Buscamos si usuario actual está permitido    
autorizado=$(echo $permitidos | grep -w $usuario)
test -z "$autorizado" || exit 0

sleep 5

#Cerramos los navegadores para que el usuario vea el mensaje
killall -9 firefox
killall -9 google-chrome
#Si llegamos aqui estamos intentando hacer login un un usuario no autorizado en el portátil
zenity --error --text="Usuario no autorizado en este portátil. Avise al profesor." --timeout 10 --width=600 --height=100
xfce4-session-logout

exit 0
Lo que hace es obtener el nombre de usuario y máquina y busca en el fichero /var/cache/.asignaciones.txt si el usuario está permitido en dicha máquina. Si no lo está, le manda un aviso y cierra la sesión.

El fichero /var/cache/.asignaciones.txt lo distribuyo por puppet en todos los portátiles y tiene este formato:
...
porthp-o19;b0:5a:da:a2:2d:0c;agomeza02
porthp-o20;30:8d:99:1d:f6:30;irenarr01
porthp-o21;30:8d:99:1c:ce:f4;lblancoa06
porthp-o21;30:8d:99:1c:ce:f4;mgarcias02
porthp-o22;30:8d:99:1a:dd:09;acarrerag27
porthp-o23;30:bd:23:22:8d:01;-
...
En este ejemplo anterior el portátil porthp-o20 sólo sería usable por el alumno irenarr01, el porthp-o21 estaría permitido a lblancoa06 y a mgarcias02, mientras que porthp-o23 podría ser usado por cualquier persona.

Lo mejor de todo: la cara de algunos alumnos cuando han venido a decirme que el portátil no les autorizaba el acceso, autoinculpándose de coger un portátil ajeno X-DDD...¿se puede ser más pardillo?

Montaje de recurso SAMBA falla en el arranque de los clientes Linux

Volvemos tras este prolongado silencio. Tengo varios recursos compartidos en un servidor samba que montan muchos equipos del centro en el arranque desde /etc/fstab con una línea como esta:
//192.168.0.99/media /media/media cifs _netdev,auto,user=user,password=password,rw,iocharset=iso8859-1,dir_mode=0777,file_mode=0777,vers=2.0
Durante años esto ha funcionado, pero tras unos cambios de ubicación de diversos recursos me he encontrado con que en algunas máquinas ya no se montaba la carpeta de forma automática en el inicio. Si una vez arrancada la máquina hacía:
# mount /media/media
Si se montaba sin problema. En el syslog veía que se producía un error de montaje en el inicio que daba a entender que se estaba intentando montar antes de estuviera disponible la red. Eso es absurdo ya que el parámetro _netdev de la línea de montaje le dice al sistema "hasta que no haya red, no montes". Pero no funciona, algo estaba fallando.

La solución adoptada es crear un fichero ejecutable en /etc/network/if-up.d/mountsmb con:
#!/bin/sh
mount -a
Esto ejecuta el script una vez que la tarjeta de red recibe IP y hay red disponible. En el script la línea "mount -a" fuerza el montaje de todo lo que hay en fstab marcado con el parámetro "auto". Y con eso se arregla el problema, aunque sigamos sin saber que lo originó.

Como dice el proverbio chino: siempre hay más soluciones que problemas.