[org.gnome.desktop.session]
session-name='gdm-fallback'
#session-name='gdm-shell'
- El usuario pulsa ESC al pedirle el login, o
- El usuario pulsa el botón de "Cancelar" al pedirle el password

[org.gnome.desktop.session]
session-name='gdm-fallback'
#session-name='gdm-shell'

Cuando tenemos muchos PC con Linux que mantener viene muy bien tener un mirror local de los repositorios que mas usemos, para tenerlo todo actualizadito lo mas rápido posible. Cada vez que cambiamos de versión de Debian hay que reconstruir los mirrors de nuevo, así que voy a dejar las notas sobre como hacerlo.
Una vez tenemos nuestros equipos manejados por puppet, no viene nada mal incluir tareas puppet para la creación de impresoras automáticamente. Esta posibilidad no la ofrece puppet por defecto, aunque a dia de hoy existe este recurso, en su día me vi en la necesidad de crear impresoras antes de que apareciese y esta es la solución que encontré y sigo usando.
El módulo puppet se llama "crea_impresora", y tiene la siguiente estructura:
crea_impresora/
├── files
│ ├── crea-impresora.sh
│ ├── Ricoh-Aficio_3035-pxlmono-Ricoh.ppd
│ └── vgim-conserjeria
└── manifests
└── init.pp
Hace poco tuve que instalar la aplicación jkiwi en varias aulas para los ciclos formativos de peluquería y estética. En los Debian con arquitectura i386 no hubo mucho problema: bajé el paquete .deb de su página y la instalé con esta clase puppet:
class instala_jkiwi {
$version="0.9.5"
$paquete="jkiwi_${version}_ubuntu.deb"
file {"/var/cache/$paquete":
owner => root, group => root, mode => 755,
source => "puppet:///instala_jkiwi/$paquete",
notify => Exec["instala_jkiwi"]
}
exec { "instala_jkiwi":
path => "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
command => "dpkg -i --force-confnew --force-overwrite $paquete; apt-get -f -y install ",
cwd => "/var/cache",
unless => "dpkg -l | grep jkiwi | grep $version | grep ^ii",
require => File["/var/cache/$paquete"],
}
file {"/var/home/usuario/Desktop/jkiwi.desktop":
owner => usuario, group => usuario, mode => 755,
source => "puppet:///instala_jkiwi/jkiwi.desktop",
}
}
Cuando lo instalé en los Debian con arquitectura amd64 no hubo problemas hasta la hora de ejecutarlo. Al hacer doble click no hacía nada y al abrirlo desde terminal me daba el error:
java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Integer
at utils.GtkStockIconSWT.createImage(GtkStockIconSWT.java:120)
Cuando tenemos los homes de nuestros usuarios alojados en un servidor NFS frecuentemente nos encontramos con que tenemos que aplicar una configuración concreta a todos ellos. En Linux eso suele ser tan sencillo como copiar un fichero a una ruta concreta dentro del home. En mi caso me he visto en la necesidad de copiar un fichero mimeTypes.rdf dentro de la configuracion Firefox de cada usuario de mi red.
El problema es que la configuración Firefox no está dentro de una ruta fija en el home, sino que está dentro de .mozilla/firefox/<perfil>.default/mimeTypes.rdf, siendo <perfil> una ristra de números y letras que identifica el perfil del usuario.
¿Hay manera de copiar el mimeTypes.rdf independientemente de cual sera el nombre del directorio de perfil?. Pues si, con:
find /home -name 'mimeTypes.rdf' -print -exec cp -f /root/mimeTypes.rdf {} \;
Con esto buscamos todos los mimeTypes.rdf que hay en todos nuestros homes y los sobrescribimos con el que hay en /root/mimeTypes.rdf.
Si quisiéramos poner un acceso directo en todos los escritorios (independientemente de que el acceso directo existiese previamente o no) haríamos:
find /home -name 'Desktop' -print -exec cp -f /root/Rayuela.desktop {} \;
Ojo, asumimos que el escritorio está en la carpeta Desktop.
Bueno, pues hecho esto en los Linux quería hacerlo también en mis Windows. El problema es que los "homes" en los Windows están en las máquinas locales, y que no parece que se pueda hacer mediante código y tengamos que ir copiando cuenta por cuenta. Pues no, para mi sorpresa resulta que se puede hacer así:
for /f "tokens=*" %a in ('dir /b/s "c:\documents and settings\mimetypes.rdf"') do copy /Y c:\ficheros\mimetypes.rdf "%a"
Comentando:
Bueno, pues ha sido una sorpresa que el intérprete de comandos de Windows pueda hacer esto. ¡Larga vida a la línea de comandos!, dejemos el ratón y el copiar y pegar cual día de la marmota para los usuarios productivos.
Para mantener actualizado el software de los Windows utilizo una herramienta llamada wpkg. Podría utilizar puppet como hacemos en los Linux, pero IMHO:
Wpkg permite instalar/actualizar/desinstalar programas y mantener algunas configuraciones aunque sea de forma rudimentaria. El esquema de funcionamiento en que se basa en wpkg es el siguiente:
Vamos a ver todos los pasos necesarios para configurarlo:
Bueno, pues en la anterior entrada teníamos que nuestra tarjeta D-Link AirPlus DWL-G520 [168c:0013] no era compatible con hostapd usando el driver estándar ath5k. A punto de tirar la toalla me acordé de los viejos drivers madwifi, que antaño soportaban las tarjetas con chip Atheros AR5XXX e incluían soporte para, dicho de forma políticamente correcta, monitorizar la seguridad de las redes inalámbricas. Parece ser que desde 2009 esos drivers ya no se desarrollan, pero no perdía nada con intentarlo.
La primera prueba que hago es descargar la última versión, descomprimiéndola sobre /root y compilando desde dentro de su directorio con:
make clean
makevaya, pues con esto veo que salen muchos errores de compilación. La respuesta sencilla: este código fuente está abandonado y no va con kernels nuevos. Afortunadamente buscando un poco más encontré que un heroico resistente llamado Pavel Roskin ha ido adaptando el código fuente para que siga funcionando en nuevos kernel.
En los IES de Extremadura normalmente montamos nuestros puntos de acceso para los portátiles de los alumnos en los servidores de aula con tarjetas D-Link DWA-556 Xtreme N, que tienen esta salida lspci:
05:00.0 Network controller [0280]: Atheros Communications Inc. AR5008 Wireless Network Adapter [168c:0024] (rev 01)
Subsystem: D-Link System Inc Device [1186:3a70]
Flags: bus master, fast devsel, latency 0, IRQ 19
Memory at fe9f0000 (64-bit, non-prefetchable) [size=64K]
Capabilities: [40] Power Management version 2
Capabilities: [50] MSI: Enable- Count=1/1 Maskable- 64bit-
Capabilities: [60] Express Legacy Endpoint, MSI 00
Capabilities: [90] MSI-X: Enable- Count=1 Masked-
Capabilities: [100] Advanced Error Reporting
Capabilities: [140] Virtual Channel
Kernel driver in use: ath9k
estas tarjetas están soportadas por hostapd y se pueden configurar sin problema según se explica en esta entrada del blog.
El reto se me presentó al intentar montar un punto de acceso con una tarjeta PCI Dlink DWL-G520, ya que tenía varias ociosas en el almacen. Su salida lspci es:
hostapd es un excelente software que permite convertir un Linux en un punto de acceso wifi totalmente configurable. La dificultad que le encuentro es que el fichero de configuración /etc/hostapd/hostapd.conf tiene un formato un poco farragoso y me cuesta un montón recordar todas las configuraciones posibles. Vamos a ver la configuración de los principales parámetros con distintos escenarios que será muy útil para hacer pruebas. Empecemos por lo básico:
#/etc/hostapd/hostapd.conf
driver=nl80211
ssid=MiWifi
interface=wlan0
bridge=br0
driver: driver a usar por el demonio hostapd para comunicarse con el kernel. Normalmente es nl80211, que soporta muchas tarjetas de red, pero hay otros mas antiguos para casos específicos: hostap, madwifi y prism54.
Ojo: muchas versiones de hostapd sólo vienen preparadas para usar el driver nl80211 y si queremos usar otro (porque la tarjeta de red que tengamos no está soportada por nl80211) hay que recompilar el hostapd (junto con el driver madwifi, por ejemplo) para activarlo.
ssid: SSID de la red wifi que se va a crear desde el punto de acceso.
interface: nombre de la tarjeta de red wifi (normalmente wlanX o athX).
bridge: si la tarjeta de red tiene un bridge con una tarjeta ethernet, debemos indicarlo añadiendo bridgle=brX, siendo brX el nombre de la tarjeta virtual creada por el bridge, con un /etc/network/interfaces parecido a:
#/etc/network/interfaces
iface eth0 inet manual
iface wlan0 inet manual
iface br0 inet static
bridge_maxwait 0
bridge_stp off
bridge_ports eth0 wlan0
address 192.168.0.254
netmask 255.255.255.0
broadcast 192.168.0.255
Bus 005 Device 024: ID 06da:0003 Phoenixtec Power Co., Ltd 1300VA UPS
[salicru]
driver = blazer_usb
desc = "SAI Salicru"
port = auto
vendorid = 06da
productid = 0003
bus = "005"
Comentemos:ACL localhost 127.0.0.1/32
ACL local_network 172.19.231.0/24
ACL all 0.0.0.0/0
ACCEPT monitor localhost
ACCEPT local_network
REJECT all allNota 23/11/2015: bueno, pues resulta que esta configuración está deprecated(=viejuna). Ahora la nueva sintaxis es esta descrita aquí. Basicamente con
indicamos a través de su IP por cual interface de red/puerto se aceptarán peticiones, en nuestro caso sería:LISTEN ip [puerto]
LISTEN 127.0.0.1 LISTEN 172.19.231.X
[admin]
password = pwd_admin
allowfrom = localhost local_network
actions = SET
instcmds = ALL
[control]
password = pwd_control
allowfrom = localhost local_network
upsmon masterMONITOR salicru@localhost 1 control pwd_control master
RUN_AS_USER nut
MINSUPPLIES 1
SHUTDOWNCMD "/root/scripts/apagar_servidores.sh"
POLLFREQ 5
POLLFREQALERT 5
HOSTSYNC 15
DEADTIME 15
POWERDOWNFLAG /etc/killpower
NOTIFYCMD "/sbin/upssched"
NOTIFYMSG ONLINE "UPS: Normal state"
NOTIFYMSG ONBATT "UPS: On battery"
NOTIFYMSG LOWBATT "UPS: Battery low"
NOTIFYMSG FSD "UPS: Starting shutdown"
NOTIFYMSG COMMOK "UPS: Communication restored"
NOTIFYMSG COMMBAD "UPS: Communication lose"
NOTIFYMSG SHUTDOWN "UPS: Shutting down"
NOTIFYMSG REPLBATT "UPS: Replace battery"
NOTIFYFLAG ONLINE SYSLOG+WALL+EXEC
NOTIFYFLAG ONBATT SYSLOG+WALL+EXEC
NOTIFYFLAG LOWBATT SYSLOG+WALL+EXEC
NOTIFYFLAG FSD SYSLOG+WALL+EXEC
NOTIFYFLAG COMMOK SYSLOG+WALL+EXEC
NOTIFYFLAG COMMBAD SYSLOG+WALL+EXEC
NOTIFYFLAG SHUTDOWN SYSLOG+WALL+EXEC
NOTIFYFLAG REPLBATT SYSLOG+WALL+EXEC
RBWARNTIME 43200
NOCOMMWARNTIME 300
FINALDELAY 0
# Network UPS Tools - upsset.conf sample file
deny from all
allow from 172.19.231.0
# Network UPS Tools: example hosts.conf
#
# This file is used to control the CGI programs. If you have not
# installed them, you may safely ignore or delete this file.
#
# -----------------------------------------------------------------------
#
# upsstats will use the list of MONITOR entries when displaying the
# default template (upsstats.html). The "FOREACHUPS" directive in the
# template will use this file to find systems running upsd.
#
# upsstats and upsimage also use this file to determine if a host may be
# monitored. This keeps evil people from using your system to annoy
# others with unintended queries.
#
# upsset presents a list of systems that may be viewed and controlled
# using this file.
#
# -----------------------------------------------------------------------
#
# Usage: list systems running upsd that you want to monitor
#
# MONITOR ""
#
# Examples:
#
# MONITOR myups@localhost "Local UPS"
# MONITOR su2200@10.64.1.1 "Finance department"
# MONITOR matrix@shs-server.example.edu "Sierra High School data room #1"
MONITOR salicru@localhost "SAI Salicru IES Virgen de Guadalupe
# Network UPS Tools: nut.conf
#
##############################################################################
# General section
##############################################################################
# The MODE determines which part of the NUT is to be started, and which
# configuration files must be modified.
#
# This file try to standardize the various files being found in the field, like
# /etc/default/nut on Debian based systems, /etc/sysconfig/ups on RedHat based
# systems, ... Distribution's init script should source this file to see which
# component(s) has to be started.
#
# The values of MODE can be:
# - none: NUT is not configured, or use the Integrated Power Management, or use
# some external system to startup NUT components. So nothing is to be started.
# - standalone: This mode address a local only configuration, with 1 UPS
# protecting the local system. This implies to start the 3 NUT layers (driver,
# upsd and upsmon) and the matching configuration files. This mode can also
# address UPS redundancy.
# - netserver: same as for the standalone configuration, but also need
# some more network access controls (firewall, tcp-wrappers) and possibly a
# specific LISTEN directive in upsd.conf.
# Since this MODE is opened to the network, a special care should be applied
# to security concerns.
# - netclient: this mode only requires upsmon.
MODE=standalone
# set upsd specific options. use "man upsd" for more info
UPSD_OPTIONS=""
# set upsmon specific options. use "man upsmon" for more info
UPSMON_OPTIONS=""
La variable MODE=standalone indica que tenemos un solo SAI y que es controlado por el PC al que está conectado localmente por el puerto USB.# Network UPS Tools - upssched.conf
CMDSCRIPT /root/scripts/avisoups.sh
##Hay que crear la ruta /var/run/nut/upssched/ si no existe con propietario nut:nut
#PIPEFN /var/run/nut/upssched/upssched.pipe
#LOCKFN /var/run/nut/upssched/upssched.lock
#Añadido 18/12/2015: por algún extraño motivo, la ruta
#/var/run/nut/upssched/ es borrada periódicamente por el sistema con lo cual
#upssched deja de funcionar. La solución mas cómoda es usar /tmp/ para almacenar
#ambos ficheros:
PIPEFN /tmp/upssched.pipe
LOCKFN /tmp/upssched.lock
# Si hay corte de corriente, se lanza un timer que esperará 300 segundos (5 minutos)
# antes de apagar
AT ONBATT * START-TIMER ups-on-battery-shutdown 300
# Si vuelve la corriente, se cancela el timer
AT ONLINE * CANCEL-TIMER ups-on-battery-shutdown
# Si hay corte de corriente, se lanza un timer que esperará 15 segundos
# antes de notificarlo
AT ONBATT * START-TIMER ups-on-battery 15
AT ONLINE * CANCEL-TIMER ups-on-battery
#En los siguientes eventos, llama al script de notificacion para que lo procese.
AT ONLINE * EXECUTE ups-back-on-line
AT REPLBATT * EXECUTE ups-change_battery
AT LOWBATT * EXECUTE ups-low-battery
AT COMMOK * EXECUTE ups-comunication-ok
AT COMMBAD * EXECUTE ups-comunication-bad
Nota 18/12/2015: como se puede ver en el listado anterior, he cambiadoAquí empieza lo bueno, expliquemos:
PIPEFN /var/run/nut/upssched/upssched.pipe
LOCKFN /var/run/nut/upssched/upssched.lock
por
PIPEFN /tmp/upssched.pipe
LOCKFN /tmp/upssched.lock
ya que la ruta /var/run/nut/upssched/ es borrada periódicamente por el sistema de forma misteriosa, inhabilitando upssched. Usando tmp ya no habrá problema ya que esa ruta existe siempre y puede escribir cualquier proceso en ella.
#!/bin/bash source mail.sh MESSAGE_MAIL="" EVENT_TYPE=$1 APAGADO=0 FECHA=$(date) case "$EVENT_TYPE" in "ups-on-battery-shutdown") MESSAGE_MAIL="UPS on battery: shutdown now" APAGADO=1 ;;"ups-on-battery")MESSAGE_MAIL="UPS on battery: warning";;"ups-comunication-bad")MESSAGE_MAIL="Communications with UPS lost";;"ups-change_battery")MESSAGE_MAIL="UPS battery needs to be replaced";;"ups-back-on-line")MESSAGE_MAIL="UPS on line power";;"ups-low-battery")MESSAGE_MAIL="UPS battery is low";;"ups-comunication-ok")MESSAGE_MAIL="Communications with UPS established";; esac mailSend "$FECHA => $MESSAGE_MAIL" "[UPS] Event $EVENT_TYPE de SAI Virgen de Guadalupe:" echo "$FECHA => SAI: $MESSAGE_MAIL" >> /var/log/sai.log if [ $APAGADO = "1" ] thensleep 30/root/scripts/apagar_servidores.sh fi
El script de apagado de servidores, /root/scripts/apagar_servidores.sh es:function mailSend() { mailsend -smtp smtp.gmail.com \-port 587 \-starttls -auth \-user micuenta@gmail.com \-pass mipassword \-f micuenta@gmail.com \-t micuenta@gmail.com \-sub "$1" -M "$2" }
#!/bin/bash
source mail.sh
FECHA=$(date)
MESSAGE_MAIL="Apagando servidores ahora mismo desde el script /root/scripts/apagar_servidores.sh."
mailSend "$FECHA => $MESSAGE_MAIL" "Aviso Servidor Virgen de Guadalupe"
echo "$FECHA => $MESSAGE_MAIL" >> /var/log/sai.log
ssh root@servidor "/sbin/shutdown -h +0"
sleep 1
ssh root@ldap "/sbin/shutdown -h +0"
sleep 1
/sbin/shutdown -h +0
/etc/init.d/nut-server restart
/etc/init.d/ups-monitor restart
Y verificar que funcionan con:upsc salicru
Cambiar "salicru" por el nombre que le hayamos puesto al SAI en /etc/nut/ups.conf. La salida será algo como:battery.charge: 100
battery.voltage: 54.60
battery.voltage.high: 52.00
battery.voltage.low: 41.60
battery.voltage.nominal: 48.0
device.type: ups
driver.name: blazer_usb
driver.parameter.bus: 005
driver.parameter.pollinterval: 2
driver.parameter.port: auto
driver.parameter.productid: 0003
driver.parameter.vendorid: 06da
driver.version: 2.6.4
driver.version.internal: 0.08
input.current.nominal: 6.0
input.frequency: 50.0
input.frequency.nominal: 50
input.voltage: 226.6
input.voltage.fault: 226.6
input.voltage.nominal: 230
output.voltage: 226.6
ups.beeper.status: enabled
ups.delay.shutdown: 30
ups.delay.start: 180
ups.load: 19
ups.productid: 0003
ups.status: OL
ups.temperature: 52.5
ups.type: offline / line interactive
ups.vendorid: 06da