Algo de Linux: febrero 2015

viernes, 27 de febrero de 2015

autopkgsync: Actualizar equipos con puppet y pkgsync


En los centros educativos de Extremadura utilizamos puppet y pkgsync para mantener actualizados y configurados los equipos del centro, ya sean servidores ltsp, portátiles o workstation.

El procedimiento que utilizamos es bastante cómodo y operativo en servidores ltsp y equipos workstation, que se encuentran conectados a la red vía ethernet. 

El problema está en los ordenadores portátiles, que habitualmente se conectan a la red única y exclusivamente a través de una conexión wifi. ¿Por qué? Bueno, pues básicamente porque el acceso inalámbrico no nos proporciona tanto ancho de banda como el cable y, encima son muchos los dispositivos que se conectan por este medio a la vez; como ejemplo, podemos poner un aula con 30 portátiles de alumnos tratando de acceder al medio.

El mayor problema, en este caso, no es puppet, sino el consumo de ancho de banda por parte de pkgsync, que realiza una actualización de los paquetes de cada máquina, instalando, actualizando y desinstalando todo aquello que tenga en sus listas. ¿Y qué es lo que sucede? Que en ocasiones, los usuarios notan que no pueden navegar o la navegación se hace lenta. 

Hemos tratado de resolver este problema limitando el consumo de ancho de banda por parte de pkgsync, pero, en ocasiones, hay portátiles que llevan más tiempo que otros sin encenderse, tienen más paquetes que actualizar y no llegan a terminar el proceso de actualización antes de ser apagados.

He dado unas cuantas vueltas al problema, pero no he encontrado una solución que, con los medios que tenemos, permita mantener el software de portátiles completamente actualizado de una forma completamente automatizada, sobre todo porque, en el caso de portátiles, no tenemos una conexión permanente que nos permita forzar la actualización de paquetes.

No obstante, se me ha ocurrido una forma "semiautomática" que me facilite la tarea de actualizarlos. Y digo semiautomática porque la solución que he adoptado consiste en añadir una entrada a grub que realice la actualización del equipo mediante puppet (si se encuentra en el centro), luego realice un pkgsync para instalar/desintalar/actualizar paquetes y, por último, apague el sistema. De este modo, puedo coger cada portátil, seleccionar la entrada de grub de actualización para que se actualice y apague cuando termine.

El sistema se basa en un script que:
  • Comprueba si la interfaz ethernet eth0 está conectada, y, si lo está, realiza la actualización y apaga el equipo.
  • Si no hay una conexión de cable, comprueba si hay una conexión a la red inalámbrica establecida y, si la hay realiza la actualización y  apaga el equipo.
  • Si no hay una conexión inalámbrica establecida, trata de conectar mediante las conexiones definidas en Network Manager. Si se logra la conexión se realiza la actualización y apaga el equipo.
  • Y si no hay conexiones definidas en Network Manager, se apagará el equipo.
En principio, he preparado este sistema para portátiles, pero es perfectamente aplicable a servidores de terminales y workstations.

Para simplificar el proceso de instalación, he creado un paquete Debian. Por si a algún compañero de otro centro le interesa y lo quiere probar, aquí dejo el enlace de descarga:
https://copy.com/ElFWglfOEix91DYE

Publicado por primera vez en http://enavas.blogspot.com.es

jueves, 26 de febrero de 2015

Script para configurar java 8 por defecto

Éste es un script que utilizo para instalar y configurar el runtime de java y el plugin para Firefox/Iceweasel. 

El paquete oracle-java8-jre se instala mediante apt-get desde el repositorio local de mi centro, donde lo tengo subido.

/usr/local/scripts/configurajava8
#!/bin/bash
#
# configurajava8 -> Instala y configura Java8 por defecto
#
# Esteban M. Navas
# IES Valle del Jerte - Plasencia
# 26/02/2015

# Instalamos el paquete facter si no está instalado aún
dpkg -l | grep ^"ii  facter" > /dev/null || apt-get -y install facter

# Instalamos el paquete oracle-java8-jre si no está instalado aún
dpkg -l | grep ^"ii  oracle-java8-jre" > /dev/null || apt-get -y install oracle-java8-jre

architecture=`facter architecture`

if [ "$architecture"  = "i386" ]; then
   update-alternatives --set java /usr/lib/jvm/jre-8-oracle-i586/bin/java
   update-alternatives --set mozilla-javaplugin.so /usr/lib/jvm/jre-8-oracle-i586/lib/i386/libnpjp2.so
elif [ "$architecture"  = "amd64" ]; then
   update-alternatives --set java /usr/lib/jvm/jre-8-oracle-x64/bin/java
   update-alternatives --set mozilla-javaplugin.so /usr/lib/jvm/jre-8-oracle-x64/lib/amd64/libnpjp2.so
fi
Aquí dejo también el enlace de descarga:
https://copy.com/DgQ9esVo1S6brKRj


Publicado por primera vez en http://enavas.blogspot.com.es

Script para actualizar el plugin de flash

Aprovechando que algún compañero me lo ha pedido, aquí dejo el script que utilizo actualmente en el centro para actualizar el plugin de flash: 

/usr/local/sbin/actualizaflash
#!/bin/bash
#
# actualizaflash -> Actualiza el plugin de flash, si no se encuentra actualizado ya
#
# Esteban M. Navas
# IES Valle del Jerte - Plasencia
# 26/02/2015


# Instalamos el paquete flashplugin-nonfree, si no está instalado aún
dpkg -l | grep ^"ii  flashplugin-nonfree" > /dev/null || apt-get -y install flashplugin-nonfree

update-flashplugin-nonfree --status | grep -e installed -e available > /tmp/flashplugin
installed=`grep "installed" /tmp/flashplugin | cut -f2 -d":" | sed 's/^ *//g'`
available=`grep "available" /tmp/flashplugin | cut -f2 -d":" | sed 's/^ *//g'`

if [ "$installed"  != "$available" ]; then
   update-flashplugin-nonfree --install
fi
 
También dejo el enlace para descargarlo:
https://copy.com/QyUFpuOyliov1LAi

Publicado por primera vez en http://enavas.blogspot.com.es

lunes, 23 de febrero de 2015

Descarga de firmware, manuales y aplicaciones de dispositivos Dlink

Aquí tenéis una página de donde descargar firmware, manuales aplicaciones para vuestros dispositivos Dlink:
http://tsd.dlink.com.tw/
Publicado por primera vez en http://enavas.blogspot.com.es

jueves, 12 de febrero de 2015

Desconectar a un usuario del sistema

A veces nos interesa "echar" a un usuario del sistema, por lo que sea. Y no penséis mal... porque hay casos en los que lo necesitamos. 

Por ejemplo, imaginad que un usuario ha dejado abierta su sesión, llega el siguiente y no puede entrar. Podemos cerrar la sesión de forma remota conectándonos mediante ssh.

En otras ocasiones estamos trabajando en una máquina y nos hemos dejado una sesión de terminal abierta terminando una tarea. Podemos cerrar esta sesión de forma remota también.

Veamos cómo, porque es muy sencillo.

Primero.- Nos conectamos mediante ssh a la máquina donde queremos cerrar la sesión de usuario.

Segundo.- Comprobamos qué usuarios y en qué terminal han iniciado sesión:
root@a22-pro:~# who
ponente  tty8         2015-02-12 13:27 (:0)
root     pts/0        2015-02-12 13:25 (recursos.valledeljerte3)
Como podéis ver en el ejemplo anterior, hay dos usuarios:
  • El usuario ponente, que ha iniciado sesión en el terminal gráfico 8.
  • El usuario root, conectado de forma remota desde la máquina recursos.valledeljerte3. Este usuario es el que he usado para conectarme remotamente y cerrar la sesión del usuario ponente.
Tercero.- Matamos los procesos del terminal tty8, que es donde ha iniciado sesión el usuario ponente y habremos cerrado su sesión:
root@a22-pro:~# pkill -9 -t tty8
Publicado por primera vez en http://enavas.blogspot.com.es

lunes, 9 de febrero de 2015

Añadir extensiones a Iceweasel en /usr/lib/iceweasel/browser/extensions/

En un post de noviembre de 2013, os contaba como añadir extensiones a Firefox para todos los usuarios si lo habíamos instalado en /opt/firefox.

Si queréis instalar extensiones para todos los usuarios en Iceweasel, no tenéis más que colocar los ficheros xpi en el siguiente directorio:
/usr/lib/iceweasel/browser/extensions
Publicado por primera vez en http://enavas.blogspot.com.es

Liberar y renovar la IP de una interfaz de red en Debian

Para liberar una IP en Debian, utilizamos el comando dhclient con el parámetro -r:
# dhclient -v -r interfaz-de-red
El parámetro -v lo utilizo para que el comando me muestre información de lo que está haciendo (verbose mode)
Por ejemplo:
# dhclient -v -r eth3
En la salida del comando, podéis comprobar que la IP ha sido liberada:
# dhclient -v -r eth3
Internet Systems Consortium DHCP Client 4.1.1-P1
Copyright 2004-2010 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/

Listening on LPF/eth3/90:e6:ba:10:3a:d4
Sending on   LPF/eth3/90:e6:ba:10:3a:d4
Sending on   Socket/fallback
DHCPRELEASE on eth3 to 172.19.144.2 port 67
Una vez liberada la IP, puedo solicitar una nueva al servidor:
# dhclient -v eth3
Publicado por primera vez en http://enavas.blogspot.com.es

viernes, 6 de febrero de 2015

Procedimiento para identificar interfaces de red en servidores LTSP de los IES

Nuestros servidores LTSP tienen 4 interfaces de red ethernet y, mientras no sea necesario, utilizamos tan sólo dos de ellas. Por convención: La superior y la inferior.

Cuando clonamos un servidor LTSP, el sistema identifica las tarjetas de red y las asigna un nombre. El problema es que el nombre que se le asigna (eth0, eth1, eth2 o eth3) va a depender del orden en que el sistema operativo las descubra y probablemente no será el correcto.

Una forma de identificar las tarjetas de red después de clonar es:

Primero.- Forzar la generación del fichero /etc/udev/rules.d/70-persistent-net.rules:
# udevadm trigger --action=add
¿Por qué? Porque justo después de clonar, este fichero aún no se habrá generado. Se regenera después de reiniciar la máquina. De este modo, nos ahorramos el reinicio.

Segundo.- Identificar qué tarjetas de red tienen el cable conectado:
# ip link | grep "state UP"
Veréis una salida parecida a la siguiente en la que podéis comprobar qué interfaces de red tienen el cable conectado:
2: eth3:  mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000
5: eth0:  mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000
En el ejemplo anterior son las correctas porque el comando lo he ejecutado en un servidor que tenía las interfaces bien configuradas.

Tercero.- Una vez identificadas, sé que una interfaz se encuentra conectada a la red del centro y la otra es la que da servicio a los terminales. Para identificar cuál está conectada a la interfaz del centro, no tengo más que hacer un dhclient:
# dhclient eth0
Si obtengo una dirección IP, sé que esta interfaz debo renombrarla como eth3. Y si no la obtengo, tendré que renombrarla como eth0.

Cuarto.- Una vez que tengo claro cuáles son los nombres que tengo que asignar a cada interfaz de red, edito el archivo /etc/udev/rules.d/70-persistent-net.rules y los modifico.

Con este método, me ahorro monitorizar el archivo /var/log/syslog y tener que sacar el ordenador del cajón para desconectar y conectar los cables para identificar las tarjetas de red.
Publicado por primera vez en http://enavas.blogspot.com.es

jueves, 5 de febrero de 2015

Borrar un nombre de paquete de todos los ficheros musthave.ies de un directorio y sus subdirectorios

Para gestionar los paquetes que se instalan en las máquinas (servidores ltsp, portátiles y workstations) utilizamos pkgsync. Habitualmente distribuyo los ficheros de pkgsync mediante un módulo puppet que almacena los ficheros de pkgsync en diferentes directorios dentro del directorio de ficheros del módulo /etc/puppet/modules/pkgsync-ies/files
Cuando quiero borrar el nombre de un paquete a todos los ficheros musthave.ies, no tengo más que ejecutar una combinación de comandos como la siguiente:
# find /etc/puppet/modules/pkgsync-ies -name musthave.ies -exec sed -i '/flashplayer-mozilla/ d' {} \;
Si examináis detenidamente el comando anterior, comprobaréis lo que hace:
  • Busca en el directorio /etc/puppet/modules/pkgsync-ies y sus subdirectorios todos los ficheros con nombre musthave.ies.
  • Y borra las líneas con el patrón buscado.
Publicado por primera vez en http://enavas.blogspot.com.es

xrandr: Asegurar la pantalla del ordenador como monitor principal en una instalación con proyector

En nuestras aulas, el servidor ltsp se encuentra conectado a una pantalla VGA y a un proyector, configurado de manera que se muestre la misma imagen tanto en el monitor como en la pantalla del proyector.

He visto que, en ocasiones, sea por el motivo que sea, la pantalla del monitor se encuentra definida como primaria y la del proyector como extensión de la primaria, o al revés.

Como nuestros usuarios lo único que quieren es tener la misma imagen en la pantalla del ordenador y en el proyector, os voy a explicar cómo he cambiado ese comportamiento para que lo apliquéis en vuestro centro, si os resulta útil.

He creado un fichero de configuración al que he llamado 45custom_xrandr con el contenido que os muestro a continuación y lo he colocado en el directorio /etc/X11/Xsession.d/ para que se ejecute al iniciarse las X:
xrandr --output VGA-0 --primary
xrandr --output DVI-0 --same-as VGA-0
Si os fijáis, lo que hace este script es muy sencillo:
  • Utiliza xrandr para definir como monitor principal la salida VGA-0.
  • Y, a continuación, define que la salida DVI-0 debe mostrar la misma imagen que la salida VGA-0.
En este caso, la tarjeta gráfica de nuestros servidores de terminales tiene dos salidas: VGA y HDMI, donde se encuentran conectados la pantalla del ordenador y el proyector. Si por alguna razón, tenéis más tarjetas gráficas o una tarjeta gráfica con más salidas, podéis identificarlas ejecutando el comando xrandr en un terminal.
Publicado por primera vez en http://enavas.blogspot.com.es

martes, 3 de febrero de 2015

Sincronizar teléfono móvil con sistema multimedia del coche vía bluetooth

Hoy en día hay muchos vehículos que incorporan Bluetooth en su sistema multimedia para permitirnos recibir llamadas, realizarlas o incluso reproducir los archivos de música almacenados en nuestro teléfono móvil.

El problema es que muchos de los smartphones no se emparejan con el sistema bluetooth del vehículo o se emparejan, pero no funciona bien la conexión bluetooth entre ambos.

Hace poco que decidí cambiar mi viejo Defy por un smartphone con chipset MTK6592 y bluetooth 4.0 entre otras cosas. Y pensé: "Teniendo bluetooth 4.0 seguro que no voy a tener ningún problema para sincronizarlo con el sistema de navegación y multimedia del Kia Sportage". Pues no. Por más veces que traté de sincronizarlo fue imposible. El sistema del Kia Sportage se encontraba aparentemente sincronizado porque aparecía en la lista de dispositivos sincronizados del smartphone. Pero el sistema del Kia mostraba un mensaje en pantalla en el que decía que había sido imposible realizar la sincronización.

Empecé a buscar en Google y encontré algunos comentarios y alguna solución que no me funcionó, como por ejemplo, renombrar el archivo mtkbt.apk

Después de mucho navegar y no encontrar información decidí buscar en Play Store, donde encontré una app que me permitió resolver el problema y que os recomiendo utilizar: "Bluetooth Fix Repair"

El autor permite un uso gratuito de la aplicación para que la problemos y podamos resolver el problema al menos una vez. Y, si queremos utilizarla en más ocasiones, podemos comprar la app "Bluetooth Fix Repair Unlocker"

Una cuestión importante que se me olvidaba comentar: Esta aplicación requiere permitos de root, por lo tanto, es necesario tener rooteado el teléfono para poderla usar.
Publicado por primera vez en http://enavas.blogspot.com.es

Activar/desactivar bluetooth en portátiles mediante udev

Cuando esta mañana he publicado el post sobre como activar/desactivar la conexión inalámbrica en el inicio mediante udev, un compañero me ha preguntado cómo podía desactivar bluetooth en portátiles.

El procedimiento es exactamente el mismo. Tan sólo cambia el tipo de dispositivo. Así que lo muestro a continuación sin más explicaciones:

Si queremos desactivar bluetooth en el inicio de la máquina, crearemos un fichero en el que definiremos el estado de bluetooth desactivado con ATTR{state}="0":

cat /etc/udev/rules.d/45-bluetooth.rules
#disable bluetooth
SUBSYSTEM="rfkill", ATTR{type}=="bluetooth", ATTR{state}="0"

Si por alguna razón, quisiéramos activar bluetooth en el inicio, no tendríamos más que cambiar el atributo estado:
cat /etc/udev/rules.d/45-bluetooth.rules
#enable bluetooth
SUBSYSTEM="rfkill", ATTR{type}=="bluetooth", ATTR{state}="1"
Publicado por primera vez en http://enavas.blogspot.com.es

Activar/desactivar conexión inalámbrica en el inicio mediante udev

En septiembre de 2014 os comenté que había clonado portátiles HP y por alguna razón me aparecía desactivada la conexión inalámbrica. Para solucionar el problema, lo que hice fue utilizar el comando rfkill para activar la conexión inalámbrica en el inicio desde el script /etc/rc.local (Podéis leerlo en el siguiente post).

Hay otra manera de asegurar que la conexión inalámbrica se encuentre activada en el inicio haciendo uso de udev y es creando un fichero de reglas en /etc/udev/rules.d como el siguiente:

cat /etc/udev/rules.d/50-wireless.rules
#enable wireless
SUBSYSTEM="rfkill", ATTR{type}=="wlan", ATTR{state}="1"

Si por alguna razón, quisiéramos desactivar la conexión inalámbrica en el inicio, no tendríamos más que cambiar el atributo estado:
cat /etc/udev/rules.d/50-wireless.rules
#enable wireless
SUBSYSTEM="rfkill", ATTR{type}=="wlan", ATTR{state}="0"
Publicado por primera vez en http://enavas.blogspot.com.es

sed: "Descomentar" las líneas que contienen un patrón determinado

Si en el post anterior vimos cómo comentar las líneas que contienen un patrón determinado, siguiendo con el ejemplo, en éste vamos a ver un ejemplo de cómo comentarlas:
# sed -i "s/^#\/usr\/sbin\/sinc_puppet_inst\ \&/\/usr\/sbin\/sinc_puppet_inst\ \&/" /etc/rc.local
Es difícil de verlo cuando hay tantos caracteres de escape, pero si os fijáis, tan sólo estamos sustituyendo una expresión en la que indicamos que el patrón comienza por un símbolo de comentario (^#)por la misma expresión sin el símbolo del comentario.
Publicado por primera vez en http://enavas.blogspot.com.es

sed: Comentar las líneas que contengan un patrón determinado

En un post anterior, os mostré como utilizar el comando sed para borrar las líneas de un archivo que contienen un patrón determinado. 

Por ejemplo: En nuestras instalaciones tenemos un script sinc_puppet_inst que se ejecuta al final del proceso de arranque y no me interesa que este script se ejecute en una determinada situación, pero, en lugar de borrar la línea, quiero comentarla para posteriormente "descomentarla". 

Para comentar la línea,  podemos hacer lo siguiente:
# sed -i  "s/\/usr\/sbin\/sinc_puppet_inst\ \&/#&/" /etc/rc.local

Donde el & representa el texto coincidente con el patrón.

Si os dáis cuenta, le estamos diciendo a sed que reemplace el patrón buscado por un ampersand delante del patrón junto con el patrón.
Publicado por primera vez en http://enavas.blogspot.com.es

lunes, 2 de febrero de 2015

Script addFNMTGoogleChrome: Añadir el certificado de la FNMT a los perfiles de Google Chrome de alumnos y profesores

En mi cuenta de GitHub he dejado un script para añadir el certificado de la FNMT a los perfiles de Firefox de alumnos y profesores. Aquí tenéis el código, por si queréis echarle un vistazo:

https://raw.githubusercontent.com/algodelinux/addFNMTGoogleChrome/master/addFNMTGoogleChrome.sh
Publicado por primera vez en http://enavas.blogspot.com.es