Archive for the ‘ Linux ’ Category

Preparar un entorno de trabajo con wmctrl

wmctrl es un programa que nos va a ayudar a generar un entorno de trabajo en el que usamos una serie de aplicaciones de forma habitual con un layout concreto.

El ejemplo siguiente funciona sobre Gnome 3 que genera de forma dinámica los escritorios virtuales (workspaces) por lo que habrá que jugar también con el comando sleep para darle tiempo a crear nuevos workspaces.

En el ejemplo se creará un entorno con una terminal, el IDE de programación Pida, un navegador, dos ventanas y Rhythmbox para escuchar música.

#!/bin/bash
# primer escritorio
wmctrl -s 0
pida &
iceweasel &
terminator --working-directory=/home/javi/Escritorio/PFC -l pfc &
sleep 5s
wmctrl -x -F -r "terminator.Terminator" -e 0,842,0,1078,1080
wmctrl -x -F -r "pida.Pida" -e 0,0,0,840,1047
wmctrl -x -F -r "Navigator.Iceweasel" -e 0,1920,369,1280,742
wmctrl -r "Iceweasel" -t 0

#segundo escritorio
nautilus /home/javi/Escritorio/PFC &
sleep 2s; 
wmctrl -F -r "PFC" -e 0,2150,330,871,638 
wmctrl -F -r "PFC" -t 1

#tercer escritorio
nautilus /home/javi/Escritorio/PFC/Documentación &
sleep 2s; 
wmctrl -r "Documentación" -e 0,2150,330,871,638 
wmctrl -r "Documentación" -t 2

#cuarto escritorio
rhythmbox &
sleep 3s; 
wmctrl -xF -r "rhythmbox.Rhythmbox" -e 0,1920,369,1280,742
wmctrl -xF -r "rhythmbox.Rhythmbox" -t 3
exit 0

Como se puede ver hay que dejar tiempos de espera con sleep para que haya tiempo para lanzarse la aplicación o crearse el workspace virtual por parte de Gnome 3.
En algunos casos se ha usado el parámetro -x la ventana usando la clase del programa cuando el programa sustituye su nombre en el título de la ventana por otro texto (caso Pida). En otros se ha usado -r que busca dicha cadena en el título de la ventana.
El parametro -F obliga a buscar estrictamente la cadena (case sensitive)

Por último, este script se puede guardar en un directorio del path como ~/bin para poder ejecutarlo fácilmente usando Alt+F2 en Gnome.

Anuncios

Síntesis de voz en Raspberry Pi con RaspBMC

Algo muy sencillo de lograr y que nos permitirá jugar un poco.
Los pasos son los siguientes:
Instalar espeak y alsa utils

aptitude update
aptitude install espeak alsa-utils

La salida de audio por defecto con RaspBMC es por HDMI pero es necesario cargar el módulo snd_bcm2835. Lo añadimos al fichero /etc/modules

Ahora, en las opciones de salida de audio de XBMC hay que poner que el dispositivo de audio este activo siempre. Por defecto sólo está activo un minuto con lo que no nos funcionaría más que la primera vez.

Para facilitar las cosas hacemos un pequeño script en bash (habla)que pondremos en /usr/local/bin para acceso general con los permisos necesarios.

#!/bin/bash
# Script para sintesis voz por consola por ratoncio

case "$#" in
0)
        cat|espeak -ves > /dev/null 2>&1
;;
*)
        echo "$@"|espeak -ves > /dev/null 2>&1
;;
esac
exit 0;

El script se puede invocar con parámetros o pipe:

  • habla hola que tal
  • echo hola que tal | habla
  • Actualización: debido a un error en el paquete espeak se puede usar este script alternativo:

    #!/bin/bash
    # Script para sintesis voz por consola por ratoncio
    FILE="/tmp/habla-$RANDOM.wav"
    case "$#" in
        0)
            cat|espeak -ves -w $FILE 
            ;;
        *)
            echo "$@"|espeak -ves -w $FILE 
            ;;
    esac
    play -q "$FILE" >/dev/null 2>&1
    rm "$FILE";
    exit 0;
    

    Para que funcione es necesario instalar sox

    apt-get install sox
    

    Servidor completo usando Raspberry Pi

    Introducción y objetivos

    El objetivo de este post es crear un completo servidor casero que permita gestionar varios servicios usando una Raspberry Pi. Este servidor se conectará a la televisión de casa mediante el puerto HDMI y a internet mediante el router y nos permitirá entre otras cosas:

    • Gestionar desde el móvil la descarga de contenidos vía torrent.
    • La reproducción vídeo y audio en la TV de casa usando el móvil como control.
    • Streaming de vídeo y audio a cualquier dispositivo que se conecte a la red de casa; DLNA
    • La gestión de una biblioteca electrónica de libros y comics permitiendo su acceso fácil a ella a dispositivos móviles tipo tablets o libros electrónicos.
    • Descarga automática de capítulos de series

    Raspberry Pi es un pequeño ordenador basado en arquitectura ARM con grandes posibilidades que corre un sistema basado en GNU/Linux.

    Los servicios básicos que queremos tener son los siguientes:

    • Apache: servidor web para servir de interfaz de varios de los servicios.
    • Calibre: para la gestión de una biblioteca electrónica.
    • Transmission: para la descarga de torrents.
    • XBMC: para disponer de un completo entorno multimedia.
    • sickbeard: para la descarga automática de capítulos de una serie.

    En mis pruebas he utilizado dos distribuciones diferentes de Linux adaptadas a Raspberry Pi ambas basadas en Debian: Raspbian y Raspmc. Debido a los problemas que supone la instalación de XBMC en Raspbian es recomendable usar Raspbmc.

    Hardware para el sistema

    Tras haber realizado varias pruebas voy a usar el siguiente hardware:

    • Una Raspberry Pi
    • Un adaptador de red inalámbrica USB para la conexión al router
    • Un cable HDMI para la conexión a la TV
    • Una tarjeta SD para instalar el arranque del sistema operativo de la Raspberry Pi
    • Una memoria USB para la instalación del sistema operativo
    • Un disco duro externo para el almacenamiento de los datos (vídeo, audio, etc)

    Uno de los pasos claves del proceso es el separar el arranque del sistema operativo del resto del SO en lugar de instalar ambos en una tarjeta SD como es el procedimiento estándar. En mi experiencia, el uso de torrents hace que el número de escrituras sobre la tarjeta SD la corrompa rápidamente. El uso de una memoria USB mejora el rendimiento y evita este problema. Una opción es particionar el disco duro externo para instalar en él el sistema operativo de la Raspberry Pi y también los datos.

    Sobre Raspbmc y su instalación

    Raspbmc es una distribución de Linux basada en debian. Su gran ventaja es que viene ya preparada con una instalación funcional de XBMC lo que simplifica en gran medida los quebraderos de cabeza que suponen instalar este programa.Hay varias formas de instalar Raspbmc en una tarjeta SD. El método que recomiendo es descargar el script python install.py de http://www.raspbmc.com/wiki/user/os-x-linux-installation/ y seguir las instrucciones.
    Este método facilita mucho la instalación de raspbmc y nos llevaría a tener instalado Raspbmc en la tarjeta SD, sin embargo, se va a mover el SO a un USB para usar sólo la SD como arranque (/boot). La instalación del sistema en el USB es tan simple como introducir una memoria USB en el momento de arrancar por primera vez la Raspberry Pi.

    Instalación y configuración de software adicional

    Vía apt se instalará transmission, apache y calibre

    apt-get update
    apt-get install transmission-daemon apache2 calibre
    

    Se cambia el nombre de host

    vi /etc/hostname
    mihost
    vi /etc/hosts
    se sustituye raspbmc por mihost mihost.noip.me en el loopback 127.0.1.1
    

    Configuración de apache2

    En la ruta /etc/apache2/sites-available se editará el fichero default
    vi /etc/apache2/sites-available/default

    <VirtualHost *:80>
            ServerAdmin pi@ratoncio.no-ip.org
    
            DocumentRoot /var/www
            <Directory />
                    Options FollowSymLinks
                    AllowOverride None
            </Directory>
            <Directory /var/www/>
                    Options Indexes FollowSymLinks MultiViews
                    AllowOverride None
                    Order allow,deny
                    allow from all
            </Directory>
            <Directory /var/www/ficheros/>
                    Options Indexes FollowSymLinks MultiViews
                    AllowOverride AuthConfig
                    Order allow,deny
                    allow from all
            </Directory>
            <Directory /var/www/biblioteca/>
                    Options Indexes FollowSymLinks MultiViews
                    AllowOverride All
                    Order allow,deny
                    allow from all
            </Directory>
    
            ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
            <Directory "/usr/lib/cgi-bin">
                    AllowOverride None
                    Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                    Order allow,deny
                    Allow from all
            </Directory>
    
            ErrorLog ${APACHE_LOG_DIR}/error.log
    
            # Possible values include: debug, info, notice, warn, error, crit,
            # alert, emerg.
            LogLevel warn
    
            CustomLog ${APACHE_LOG_DIR}/access.log combined
    
            #para calibre y transmission
            RewriteEngine on
    
            ProxyPass /descargas/ http://localhost:9999/descargas/
            ProxyPass /descargas http://localhost:9999/descargas
            SetEnv force-proxy-request-1.0 1
            SetEnv proxy-nokeepalive 1
    </VirtualHost>
    

    Se habilitan los mods de apache necesarios para hacer rewrite, necesario para poder redirigir a distintos puertos calibre y transmission desde apache.

    a2enmod proxy rewrite proxy_http
    

    Se crea la estructura web en /var/www
    Se crea un directorio en /var/www/biblioteca con usuario y grupo www-data

    Configuración de calibre

    En la ruta /home/pi se crea un script calibre-server que permitirá lanzar y parar calibre en modo server. Calibre correrá en un puerto al que se redirigirá desde la página web que servimos con apache.

    #!/bin/bash
    export LANG=es_ES.UTF-8
    if [ $# -eq 1 ];then
    case $1 in
    start)
    calibre-server --with-library=/media/Almacen/biblioteca/ --daemonize --port 10001 --url-prefix /biblioteca ;
    echo "La biblioteca esta abierta";
    ;;
    stop)
    #killall calibre-server;
    kill -9 `ps -fea|grep calibre-server|grep -v grep|awk '{print $2}'`;
    echo "La biblioteca esta cerrada";
    ;;
    status)
    RESUL=`ps aux|grep -v grep|grep "calibre-server"|wc -l`;
    if [ $RESUL -eq 0 ];then
    echo "La biblioteca esta cerrada";
    else
    echo "La biblioteca esta abierta";
    fi;
    ;;
    *)
    echo "Opciones: start|stop"
    ;;
    esac;
    fi;
    

    El control de acceso se hace mediante un fichero .htaccess que se encuentra en /var/www/biblioteca con este contenido:

    AuthUserFile /home/pi/pass-htaccess-apache
    AuthType Basic
    AuthName "Haz login"
    Require user javi mariola
    Options +FollowSymLinks
    RewriteEngine on
    RewriteRule (.*) http://localhost:10001/biblioteca/$1 [proxy]
    

    Se puede ver que el script lanza en modo daemon calibre en el puerto 10001 con la ruta que hayamos configurado con la biblioteca. Al acceder vía web a la ruta mihost.noip.me/biblioteca se nos redirigirá al server corriendo en el puerto 10001 con calibre.

    Configuración de transmission-daemon

    Para emplear torrents se configurará transmission-daemon.

    Se edita el fichero /var/lib/transmission-daemon/info/settings.json (es un enlace a /etc/transmission-daemon/settings.json). Para que este fichero se edite correctamente el servidor transmission debe estar parado así:

    service transmission-daemon stop

    {
        "alt-speed-down": 50,
        "alt-speed-enabled": true,
        "alt-speed-time-begin": 420,
        "alt-speed-time-day": 127,
        "alt-speed-time-enabled": true,
        "alt-speed-time-end": 0,
        "alt-speed-up": 10,
        "bind-address-ipv4": "0.0.0.0",
        "bind-address-ipv6": "::",
        "blocklist-enabled": false,
        "blocklist-url": "http://www.example.com/blocklist",
        "cache-size-mb": 4,
        "dht-enabled": true,
        "download-dir": "/media/Almacen/transmission-daemon/downloads",
        "download-limit": 100,
        "download-limit-enabled": 0,
        "download-queue-enabled": true,
        "download-queue-size": 12,
        "encryption": 0,
        "idle-seeding-limit": 30,
        "idle-seeding-limit-enabled": false,
        "incomplete-dir": "/media/Almacen/transmission-daemon/incomplete",
        "incomplete-dir-enabled": false,
        "lpd-enabled": false,
        "max-peers-global": 200,
        "message-level": 2,
        "peer-congestion-algorithm": "",
        "peer-limit-global": 300,
        "peer-limit-per-torrent": 60,
        "peer-port": 51413,
        "peer-port-random-high": 65535,
        "peer-port-random-low": 49152,
        "peer-port-random-on-start": false,
        "peer-socket-tos": "default",
        "pex-enabled": true,
        "port-forwarding-enabled": true,
        "preallocation": 1,
        "prefetch-enabled": 1,
        "queue-stalled-enabled": true,
        "queue-stalled-minutes": 30,
        "ratio-limit": 2,
        "ratio-limit-enabled": false,
        "rename-partial-files": true,
        "rpc-authentication-required": true,
        "rpc-bind-address": "0.0.0.0",
        "rpc-enabled": true,
        "rpc-password": "contraseniaservicio",
        "rpc-port": 9999,
        "rpc-url": "/descargas/",
        "rpc-username": "descargas",
        "rpc-whitelist": "127.0.0.1",
        "rpc-whitelist-enabled": false,
        "script-torrent-done-enabled": true,
        "script-torrent-done-filename": "/var/lib/transmission-daemon/script/avisaTorrent",
        "seed-queue-enabled": false,
        "seed-queue-size": 10,
        "speed-limit-down": 350,
        "speed-limit-down-enabled": false,
        "speed-limit-up": 20,
        "speed-limit-up-enabled": true,
        "start-added-torrents": true,
        "trash-original-torrent-files": false,
        "umask": 18,
        "upload-limit": 100,
        "upload-limit-enabled": 0,
        "upload-slots-per-torrent": 14,
        "utp-enabled": true,
        "watch-dir": "/media/Almacen/transmission-daemon/blackhole",
        "watch-dir-enabled": true
    
    }
    
    

    A continuación se edita el fichero /etc/init.d/transmission-daemon y se indica en USER que el usuario será pi

    Y se hace chown -R pi:pi /var/lib/transmission-daemon/* y chown pi:pi /etc/transmission-daemon/settings.json

    Configuración de NFS

    Hacer que cargue nfs en el arranque.

    apt-get install nfs-kernel-server
    update-rc.d rpcbind defaults
    update-rc.d nfs-common defaults
    update-rc.d nfs-kernel-server defaults
    

    Se definen los exports

    /media/Almacen *(ro,sync,no_subtree_check,insecure,all_squash,anonuid=0,anongid=0)
    

    Se refrescan los exports
    exportfs -ra

    Configuración Sickbeard

    sudo apt-get install git-core
    git clone git://github.com/echel0n/SickBeard-TVRage.git /var/local/sickbeard
    cd /var/local/sickbeard
    python SickBeard.py -d
    

    Sickbeard arranca en el puerto 8081. En un navegador entramos en dicha dirección y seleccionamos config y general.
    Desactivar Launch Browser pues el acceso será web.
    En web interface se puede configurar un user, passwd y nuevo puerto. Solo cambiaré el puerto por otro (20001) pues la autenticación la hago con htacess
    En search providers se chequean los gratuitos sin cuenta ( NZBs, Sick Beard y Womble)
    En post processing se quita la opción de keep original files y se marcan las move associated files y rename episodes. En name pattern seleccionamos “s02e03 – Ep Name”
    En metadata seleccionamos XBMC (12+ pues la versión de Raspbmc equivale a la 12 o superior) y chequeamos los metadatos (todos menos los season all)
    En config notifications seleccionamos XBMC y chequeamos notify on download, update library, introducimos la ip y el puerto (192.168.1.124:1234)
    En search options, torrent search activamos la búsqueda de torrents, el método blackhole y definimos una ruta para el directorio blackhole (/media/Almacen/transmission-daemon/blackhole)
    Ya se puede trabajar seleccionando add existing shows si ya tenemos parte de la serie descargada o add shows si aún no.

    Recuperar un Grub al fallar la instalación

    Arrancar desde una live distro. Se puede configurar una fácilmente usando unetbootin en un USB.

    Montar la partición con /boot en algún directorio. Pej. /mnt/debian

    
    grub-install --root-directory=/mnt/debian/ /dev/sda
    
    

    Rearrancar. Debería aparecer un prompt así: grub>

    linux /boot/vmlinuz-x.x.x-x-xxxxxx root=/dev/sdXY ro

    initrd /boot/initrd.img-x.x.x-x-xxxxx

    boot

    Una vez haya arrancado el sistema

    
    grub-install
    
    update-grub2