Algo de Linux

jueves, 25 de junio de 2015

Debian Jessie con cinnamon

En un post anterior os mostré cómo instalar cinnamon en una Debian Jessie ya instalada. Instalarlo desde el DVD es trivial porque tan sólo tendréis que elegir el escritorio que queréis usar en una lista:
  • Gnome 3.14 
  • KDE 4.11 
  • Xfce 4.10 
  • LXDE 
  • Cinnamon 
  • Mate 
Para máquinas antiguas con recursos muy limitados sería conveniente usar Xfce o LXDE, pero si tenemos un equipo actual con un hardware más o menos reciente y ram, me gusta mucho Debian Jessie con cinnamon. No quiero hacer especificaciones concretas porque todo es muy relativo, pero os puedo decir que en un amd de 64 bits con 2 gb de ram me funciona muy bien. Ahora lo he subido a 8 gb porque necesito ram para trabajar con máquinas virtuales, pero para un uso habitual del escritorio con 2 gb me era más que suficiente.

Os muestro una imagen de mi escritorio con el menú de aplicaciones abierto:


Para los que usamos mucho más el teclado que el ratón, es bastante cómodo abrir el menú pulsando una tecla y comenzar a escribir el nombre de una aplicación para lanzarla inmediatamente pulsando enter.

Además en cinnamon se puede cambiar muy fácilmente el aspecto del escritorio añadiendo extensiones, desklets y applets, algo de agradecer después de lo complicado que nos ha sido hacer esto mismo en Debian Wheezy con gnome-fallback.



Otra cosa que me ha sorprendido gratamente de Debian Jessie ha sido el tiempo de arranque y apagado del sistema operativo, éste último prácticamente instantáneo.

Ahora bien, ¿seguiremos utilizando Debian en educación? ¿O cambiaremos a Ubuntu+Windows como alguien ya ha decidido sin estudiar debidamente el tema y consultarlo con los administradores?
Publicado por primera vez en http://enavas.blogspot.com.es

jueves, 18 de junio de 2015

sed: Insertar una línea después de un patrón determinado

En un post anterior mostrábamos un ejemplo en el que insertábamos una línea antes de un patrón determinado en el fichero /etc/rc.local para añadir la llamada a un script que debe ejecutarse en un momento determinado.

En este post, vamos a mostrar como insertar la llamada a un script en el fichero /etc/rc.local después de un patrón determinado:
# sed -i '/# By default this script does nothing./a \/usr\/local\/bin\/ConectaWifi' /etc/rc.local

Si os dáis cuenta, lo que estoy haciendo es insertar la llamada al script utilizando el parámetro /a para insertar justo después del último comentario que viene por defecto en el fichero. Con ésto consigo que la llamada al script se realice antes que cualquier otro script.
Publicado por primera vez en http://enavas.blogspot.com.es

miércoles, 17 de junio de 2015

Obtener las direcciones MAC de las tarjetas inalámbricas de portátiles usando el inventario de puppet

Vamos a ver un ejemplo de combinación de comandos para obtener las direcciones MAC de las tarjetas inalámbricas de portátiles usando el inventario de puppet y de paso, utilizamos el comando sed como explicamos en el post anterior para quitar las comillas entre las que viene la dirección MAC. 

Para empezar, debemos saber que el servidor puppet guarda un inventario de los facts con un fichero por máquina en el directorio /var/lib/puppet/yaml/facts/.

Si hacéis un ls, podréis comprobarlo:
# ls /var/lib/puppet/yaml/facts/
Con ésto, obtendréis un listado de todos los ficheros de inventario de cada equipo. Los nombres de estos ficheros tendrán la siguiente forma:

nombre.dominio.yaml 

En mi centro tengo nombrados los portátiles de alumnos de la misma manera que nombramos terminales: a01-o01, a01-o02, etc... De este modo, si quiero listar los ficheros de portátiles del aula a01, no tengo más que ejecutar el comando de forma que liste tan sólo los archivos que comienzan por "a01-":
# ls /var/lib/puppet/yaml/facts/a01-*
Bien. Si ahora combinamos nuestro comando con un grep que busque dentro de cada fichero la cadena "macaddress_wlan0":
# ls /var/lib/puppet/yaml/facts/a01-* | xargs grep "macaddress_wlan0"
Obtendremos un listado con el nombre de cada fichero y la MAC:
a01-o01.valledeljerte3.yaml:    macaddress_wlan0: "74:2f:68:94:3c:5b"
a01-o02.valledeljerte3.yaml:    macaddress_wlan0: "74:2f:68:94:3b:0f"
a01-o03.valledeljerte3.yaml:    macaddress_wlan0: "74:2f:68:94:39:2f"
a01-o04.valledeljerte3.yaml:    macaddress_wlan0: "74:2f:68:94:3e:cb"
a01-o05.valledeljerte3.yaml:    macaddress_wlan0: "74:2f:68:94:2c:2d"
a01-o06.valledeljerte3.yaml:    macaddress_wlan0: "74:2f:68:94:2b:e0"
a01-o07.valledeljerte3.yaml:    macaddress_wlan0: "74:2f:68:94:43:97"
a01-o08.valledeljerte3.yaml:    macaddress_wlan0: "74:2f:68:94:1e:4f"
a01-o09.valledeljerte3.yaml:    macaddress_wlan0: "74:2f:68:94:1c:e2"
a01-o10.valledeljerte3.yaml:    macaddress_wlan0: "74:2f:68:94:37:37"
a01-o11.valledeljerte3.yaml:    macaddress_wlan0: "74:2f:68:94:2b:93"
a01-o12.valledeljerte3.yaml:    macaddress_wlan0: "74:2f:68:94:37:b7"
a01-o13.valledeljerte3.yaml:    macaddress_wlan0: "74:2f:68:94:3b:9a"
a01-o14.valledeljerte3.yaml:    macaddress_wlan0: "74:2f:68:94:38:41"
a01-o15.valledeljerte3.yaml:    macaddress_wlan0: "74:2f:68:94:29:6c"
a01-o16.valledeljerte3.yaml:    macaddress_wlan0: "74:2f:68:94:21:34"
a01-o17.valledeljerte3.yaml:    macaddress_wlan0: "74:2f:68:94:46:69"
a01-o18.valledeljerte3.yaml:    macaddress_wlan0: "74:2f:68:94:21:9f"
a01-o19.valledeljerte3.yaml:    macaddress_wlan0: "74:2f:68:94:3b:01"
a01-o20.valledeljerte3.yaml:    macaddress_wlan0: "74:2f:68:94:1e:42"
Como lo que me interesa del listado anterior es quedarme tan sólo con la dirección MAC, puedo hacer lo siguiente:
# ls /var/lib/puppet/yaml/facts/a01-* | xargs grep "macaddress_wlan0" | awk '{print $3}'
Con lo que me quedaría tan sólo con las direcciones MAC:
"74:2f:68:94:3c:5b"
"74:2f:68:94:3b:0f"
"74:2f:68:94:39:2f"
"74:2f:68:94:3e:cb"
"74:2f:68:94:2c:2d"
"74:2f:68:94:2b:e0"
"74:2f:68:94:43:97"
"74:2f:68:94:1e:4f"
"74:2f:68:94:1c:e2"
"74:2f:68:94:37:37"
"74:2f:68:94:2b:93"
"74:2f:68:94:37:b7"
"74:2f:68:94:3b:9a"
"74:2f:68:94:38:41"
"74:2f:68:94:29:6c"
"74:2f:68:94:21:34"
"74:2f:68:94:46:69"
"74:2f:68:94:21:9f"
"74:2f:68:94:3b:01"
"74:2f:68:94:1e:42"
Si os dáis cuenta, tan sólo hay un pequeño problemilla fácil de resolver: Que las direcciones MAC se encuentran entre comillas. Para quitarlas, tan sólo tenemos que aplicar el comando sed como os mostré en el post anterior:
# ls /var/lib/puppet/yaml/facts/a01-* | xargs grep "macaddress_wlan0"| awk '{print $3}' | sed 's/^.\|.$//g'
Y listo. Ya tenemos lo que queríamos: El listado de direcciones MAC de los portátiles del aula a01:
74:2f:68:94:3c:5b
74:2f:68:94:3b:0f
74:2f:68:94:39:2f
74:2f:68:94:3e:cb
74:2f:68:94:2c:2d
74:2f:68:94:2b:e0
74:2f:68:94:43:97
74:2f:68:94:1e:4f
74:2f:68:94:1c:e2
74:2f:68:94:37:37
74:2f:68:94:2b:93
74:2f:68:94:37:b7
74:2f:68:94:3b:9a
74:2f:68:94:38:41
74:2f:68:94:29:6c
74:2f:68:94:21:34
74:2f:68:94:46:69
74:2f:68:94:21:9f
74:2f:68:94:3b:01
74:2f:68:94:1e:42
Una vez visto ésto, es muy fácil retocar la combinación de comandos para obtener cualquier otro dato de los equipos.
Publicado por primera vez en http://enavas.blogspot.com.es

sed: Eliminar caracteres al principio y al final de una línea

Supongamos que queremos eliminar el primer caracter de una expresión o cada línea de un archivo, sea cual sea. Podemos hacerlo fácilmente utilizando sed:
sed 's/^.//g'
Ahora bien, si lo que queremos es eliminar el último caracter de una expresión o cada línea de un archivo, utilizaríamos sed de la siguiente manera:
sed 's/.$//g'
Y si lo que queremos es eliminar tanto el primer como el último caracter de cada línea:
sed 's/^.\|.$//g'
Este último caso lo he utilizado para quitar las comillas de uno de los campos de un fichero.
Publicado por primera vez en http://enavas.blogspot.com.es

martes, 16 de junio de 2015

Copiar ficheros de configuración a /etc/skel y replicar en directorios home mediante puppet

Es interesante poder añadir ficheros de configuración para nuevos usuarios mediante puppet en /etc/skel, para que cuando se cree un nuevo usuario, se le apliquen las nuevas configuraciones, pero tan importante como ésto es aplicar también las nuevas configuraciones a los usuarios ya creados.

Del mismo modo que en el post anterior, la parte de añadir ficheros de configuración en /etc/skel es trivial:
file { "/etc/skel/.config/plank/dock1/settings":
       source => "puppet:///puppet-plank-sync-portatiles/settings",
       owner => root, group => root, mode => 644,
}
Lo que no resulta tan trivial es colocar la misma configuración en los directorios home de los usuarios. No obstante, si utilizamos el comando find en un recurso exec y lo relacionamos con el recurso file, la cosa no resulta tan complicada:
file { "/etc/skel/.config/plank/dock1/settings":
       source => "puppet:///puppet-plank-sync-portatiles/settings",
       owner => root, group => root, mode => 644,
       notify => Exec['sincroniza-ajustes-plank-user']
}

exec { 'sincroniza-ajustes-plank-user':
       command => '/usr/bin/find /home/ -type d -path "*.config/plank/dock1" -exec cp /etc/skel/.config/plank/dock1/settings {} \;',
       subscribe => File ['/etc/skel/.config/plank/dock1/settings'],
       refreshonly => true
}
De este modo, estamos colocando el fichero settings en el directorio /etc/skel/.config/plank/dock1, y, siempre que se modifique, lo copiamos a los directorios home de los usuarios.
Publicado por primera vez en http://enavas.blogspot.com.es

Borrar ficheros de /etc/skel y directorios home mediante puppet

En ocasiones, necesitamos borrar un fichero del directorio /etc/skel para que no se añada cuando se cree un nuevo usuario, pero, al mismo tiempo, queremos que ese mismo fichero se borre de los directorios home de los usuarios.

Por ejemplo, supongamos que tengo un lanzador "laptopuserconfig.desktop" que permite lanzar una aplicación de configuración cuando el usuario inicia sesión por primera vez y quiero que se deje de ejecutar ese script de configuración. Lo que tendré que hacer será borrar el lanzador laptopuserconfig.desktop del directorio /etc/skel/.config/autostart/ y de los directorios home de cada usuario que exista en el sistema. 

El borrado del fichero en /etc/skel es sencillo:
file { "/etc/skel/.config/autostart/laptopuserconfig.desktop":
      ensure => absent,
}
Lo más complicado de hacer con puppet, sería borrar el fichero de los directorios home de los usuarios puesto que no sabemos qué usuarios existen en /home. No obstante, si lo pensamos bien, no es tan difícil si recurrimos al comando find y relacionamos bien los recursos file y exec:
file { "/etc/skel/.config/autostart/laptopuserconfig.desktop":
      ensure => absent,
      notify => Exec["remove-laptopuserconfig-homes"]

}

exec { "remove-laptopuserconfig-homes":
        command => "/usr/bin/find /home/ -name 'laptopuserconfig.desktop' -exec rm {} \;",
        onlyif => "test -f /etc/skel/.config/autostart/laptopuserconfig.desktop"
}
Publicado por primera vez en http://enavas.blogspot.com.es

domingo, 7 de junio de 2015

Usuarios de ldap "no pueden" utilizar dispositivos USB

Cuando escribía el post de ayer, me estaba acordando de que alguien me habían comentado que no les funcionaban los dispositivos USB en el Virtualbox que habíamos instalado en Debian. Y, si en lugar de dar por hecho que era un fallo del sistema, me lo hubieran dicho antes, lo habían tenido solucionado en un momento porque era algo muy fácil de resolver.

En Virtualbox, para que un usuario pueda utilizar dispositivos usb, debe pertenecer al grupo local de sistema vboxusers que se crea al instalar Virtualbox.

Como los usuarios iniciaban sesión autentificándose mediante ldap, se les asignaban los grupos de ldap más los grupos especificados en el archivo /etc/security/group.conf. Y, como no se añadían los usuarios al grupo vboxusers, lógicamente, no podían utilizar los dispositivos usb.

La solución era tan sencilla como añadir el grupo vboxusers al archivo /etc/security/group.conf. Por ejemplo, si la regla que permite asignar grupos locales a los usuarios en el fichero anterior es como la siguiente:
*; *; *; Al0000-2400; audio,cdrom,floppy,plugdev,video,lp,lpadmin,netdev,games,fuse
Lo único que tenéis que hacer es añadir vboxusers a esa regla:
*; *; *; Al0000-2400; audio,cdrom,floppy,plugdev,video,lp,lpadmin,netdev,games,fuse,vboxusers
/etc/security/group.conf/et
/etc/security/group.conf

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