Archive for the ‘ Scripts ’ 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

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.

Convertir comics en formato pdf a formato cbz

Para una visión más cómoda. Con este sencillo script que requiere poppler-utils

# pdf2cbz: Conversor de formato para comics por ratoncio
#!/bin/bash
for i in *.pdf;do
echo "************";
echo "$i";
echo "************";
mkdir "${i%.pdf}";
pdfimages -j "$i" "${i%.pdf}"/0;
zip -r "${i%.pdf}".cbz "${i%.pdf}";
rm -rf "${i%.pdf}";
done

El siguiente para convertir de cbr a cbz

# cbr2cbz: Conversor de formato para comics por ratoncio
#!/bin/bash
for i in *.cbr;do
echo "************";
echo "$i";
echo "************";
mkdir "${i%.cbr}";
unrar e "$i" "${i%.cbr}";
zip -r "${i%.cbr}".cbz "${i%.cbr}";
rm -rf "${i%.cbr}";
done

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
    

    wr – script para consultar términos en inglés en Wordreference

    
    #!/bin/sh
    # buscador múltiple de word reference
    # introducir wr seguido de los terminos a buscar en inglés
    
    echo RESULTADOS DE BUSQUEDA DE:
    echo $1
    vartratada=`echo $1|sed 's/\ /_/g'`
    echo  ++++++++++++++++++++++++++++++++++++++++++++
    echo  WORD REFERENCE: $1
    echo  ++++++++++++++++++++++++++++++++++++++++++++"\n"
    wget http://wordreference.com/es/translation.asp\?tranword=$1\&dict=enes\&B10=Search -U mozilla -q -O /tmp/wordref$vartratada
    html2text -utf8 -o /tmp/wordref$vartratada.txt /tmp/wordref$vartratada
    cat /tmp/wordref$vartratada.txt|tail -n +20|head -n 20
    rm /tmp/wordref$vartratada /tmp/wordref$vartratada.txt
    

    Envío múltiple de ficheros con netcat

    Valga esto como curiosidad. Lo uso para evitar el uso de scp que pide contraseña al transferir archivos (habitualmente sale más a cuenta hacer un tar con los archivos y buscar la contraseña para el scp).

    Supongamos que queremos enviar entre hostorigen y hostdestino 10 archivos: file0-file9.

    En hostdestino:

    for i in `seq 0 9`;do nc -l 3000 > file"$i";done
    

    Se ejecuta primero esto.

    En hostorigen:

    for i in `seq 0 9`;do cat file"$i"|nc hostdestino 3000;sleep 2s;done
    

    El sleep es la parte crucial, hace que espere dos segundos para que el hostdestino tenga tiempo de sobra de entrar en el siguiente ciclo de escucha en netcat.

    Por supuesto, al depender de un temporizador para realizar la “sincronización” este proceso no es a prueba de fallos. Lo dicho, una curiosidad más que algo realmente práctico.