Archive for the ‘ Raspberry Pi ’ Category

Abrir y cerrar el acceso desde el exterior por SSH usando gtalk

En la Raspberry Pi recibo diariamente desde China varios cientos de intento de acceso al servicio SSH. Aprovechando el post anterior vamos a modificar algo el script external para hacer que el acceso a SSH desde el exterior esté abierto o cerrado a voluntad. Indicaremos con una orden vía gtalk a Raspberry Pi que abra o cierre el puerto, algo similar a lo que se haría con port-knocking.

En external añadimos las siguientes líneas:

ssh.abre)
    /usr/local/bin/ssh.abre; 
    ;;
ssh.cierra)
   /usr/local/bin/ssh.cierra; 
   ;;

Enviando los comandos ssh.cierra y ssh.abre se añadirá o eliminará una regla en Iptables. Para esto hace falta crear un par de scripts que irán en /usr/local/bin
ssh.abre:

#!/bin/sh
# ssh.abre por ratoncio
sudo iptables -I INPUT -p tcp --dport 22 -j ACCEPT
echo "Abierto el acceso por SSH";

ssh.cierra:

#!/bin/sh
# ssh.cierra por ratoncio
num=$(sudo iptables -L -n --line-numbers|grep "tcp dpt:22"|awk '{print $1}')
/usr/local/bin/iptables.remove "$num";
echo "Cerrando el acceso exterior por SSH";

Ahora se puede indicar a Raspberry cuando queremos acceder desde el exterior de nuestra red local por SSH.

Anuncios

Control de raspberry usando gtalk

El objetivo es enviar comandos y recibir información de la raspberry pi usando gtalk.
Para esto usaremos centerim; un programa que permite mediante consola conectarse a varios servicios de IM como gtalk. Para dejar este programa en segundo plano emplearemos screen.

Por defecto RaspBMC tiene las preferencias de apt-get configuradas para que instale los paquete extras. Debido a esto se produce una instalación de 250MB y que para colmo rompe el servicio XBMC. Para evitar esto se edita el fichero /etc/apt/apt.conf y se añaden las líneas:

APT::Install-Recommends "0";
APT::Install-Suggests "0";

Tras esto instalamos:

apt-get install centerim screen

Una vez instalado se ejecuta centerim con el usuario que se usará para arrancarse normalmente. En mi caso, pi.
En la opción jab se rellenan las opciones de la cuenta gmail que usaremos para la Raspberry. Una vez hecho esto se creará una estructura de directorios que se podrá editar:
home/pi/.centerim/
En el fichero config tendremos que tener algo similar a esto:

jab_nick    cuentapararaspberrypi@gmail.com
jab_pass    contraseña
jab_server  talk.google.com:5223
jab_osinfo  1
jab_prio    4
jab_ssl     1

Para arrancar el sistema automaticamente se añade la siguiente línea a /etc/rc.local

su pi -c 'screen -dmS centerim /usr/bin/centerim'

Ahora configuraremos el fichero external que está en el directorio .centerim
El siguiente ejemplo es el mío que realiza varias acciones:

%action         Remote control
event           msg
proto           all
status          all
options         stdin stdout

%exec
#!/bin/sh
# script de mayordomo gtalk-raspberry pi por ratoncio
ENTRADA=`cat`;
# el comando se fuerza a minusculas para evitar problemas con las mayusculas automaticas de los moviles
COMANDO=`echo $ENTRADA|awk '{print $1}'|tr '[:upper:]' '[:lower:]'`;
RESTO=`echo $ENTRADA|awk -F "$COMANDO " '{print $2}'`;
if [ $CONTACT_NICK = aquifiltropormipropiacuentade@gmail.com ]; then
case $COMANDO in
        df) df -h;;
        uptime) uptime;;
        vmstat) vmstat;;
        who) w;;
        mem) free -m;;
        dmesg)
            dmesg |tail -n 20
                    echo "----";
            echo "Fin dmesg";
        ;;
        apunta|nota)
            echo "Apunto esto: $RESTO";
            echo "$RESTO" >> /home/pi/notasRTN;
        ;;
        notas)
            #cat /home/pi/notasRTN;
            echo;
            i=1;while read linea;do echo "$i: $linea";i=`echo $i +1|bc`;done</home/pi/notasRTN;
            echo "----";
            echo "No hay mas notas";
            ;;
        borranota)
            sed "$RESTO"d /home/pi/notasRTN > /tmp/notasRTN.tmp;
            mv /tmp/notasRTN.tmp /home/pi/notasRTN;
            rm /tmp/notasRTN.tmp;
            echo "Borrada nota $RESTO";
        ;;
        diag)
            /opt/vc/bin/vcgencmd measure_temp;
            /opt/vc/bin/vcgencmd measure_volts;
        ;;
        torrent)
            echo "torrent (start|stop|status)";
            /etc/init.d/transmission-daemon $RESTO;
        ;;
	    hora)
            echo "Son las `date +%H:%M:%S`";
        ;;
        biblioteca)
            echo "biblioteca (start|stop)";
            /home/pi/calibre-server $RESTO;
        ;;
        ayuda|help)
            echo "Soy Ratoncio, tu asistente electronico. Los comandos validos son:";
            echo ;
            echo "df";
            echo "uptime";
            echo "vmstat";
            echo "who";
            echo "dmesg";
            echo "agenda";
            echo "apunta";
            echo "notas";
            echo "borranota";
		    echo "servicios";
		    echo "diag";
		    echo "torrent";
		    echo "hora";
		    echo "biblioteca (start|stop)";
            echo "ayuda";
        ;;
        *)
		    echo "Has dicho: $ENTRADA";
		    echo "----";
		    echo "Lo siento, no entiendo tu pregunta. Prueba con 'ayuda'.";
        ;;
    esac
fi;

Enviar Pop-ups informativos a XBMC

Esto nos permitirá sacar Pop-ups en la interfaz de XBMC. Realmente sencillo usando la interfaz que nos proporciona XBMC (JSON-RPC API). Lo colocaremos en /usr/local/bin para acceso general.

Vamos con el script en cuestión: msgtoxbmc

# msgtoxbmc: script para enviar pop ups a XBMC por ratoncio
#!/bin/bash
# procesado del pipe
case "$#" in
0)
        mensaje=`cat`
;;
*)
        mensaje="$@"
;;
esac;
# codigo envio
mensajeenviar=`echo $mensaje|sed 's/\ /\%20/g'`
titulo="Informacion%20de%20Ratoncio"
wget -qO- "http://192.168.1.124:8080/jsonrpc?request={%22jsonrpc%22:%222.0%22,%22method%22:%22GUI.ShowNotification%22,%22params%22:{%22title%22:%22$titulo%22,%22message%22:%22$mensajeenviar%22},%22id%22:1}" &> /dev/null
#habla "`echo $mensaje|sed 's/\%20/\\ /g'`"
exit 0;

La invocación, sencilla, por parámetros o usando pipe:

  • msgtoxbmc mensaje de prueba
  • echo mensaje de prueba|msgtoxbmc

Si en el script se descomenta la línea penúltima (habla) se oiría el mensaje por la TV (usando el script habla del post anterior)

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.