23/9/15

Comprobar dependencias de un script.

Muchas veces, hacemos uso de otros paquetes que facilitan la programación (y la ejecución) de nuestros scripts, y me ha parecido oportuno escribir una pequeña rutina que compruebe la existencia de los paquetes dados.

Pasaremos los paquetes a comprobar en una matriz o array, y si no estan instalados procederemos a la instalación de los mismos. Supongamos que necesitamos los tres siguientes paquetes: zenity, mplayer y xdotool. Pasaremos los nombres al array al que hemos llamado "dependencias".
#!/bin/bash
# Autor: Esteban C. Sanz

dependencias=(zenity mplayer xdotool)
for item in ${dependencias[*]}
do
 if ! (pacman -Q $item >/dev/null);
 then
  lista=$lista" "$item
 fi
done
if [ -n "$lista" ]
then
 sudo pacman -S $lista --noconfirm
fi
De esta forma, la primera vez que se ejecute vuestro script, este se asegurará de que esté todo en orden para la correcta ejecución del mismo. Como siempre, espero os sea útil.

14/9/15

Comprobar si estamos conectados a internet en Bash.


La función de este código es sencilla. Nos será util en con scripts que requieran conexión a internet. Sencillamente hace una llamada a Google.com (podria ser cualquier página existente), enviando un paquete (-c1) y obtenemos la salida de ping a /dev/null
#!/bin/bash

if ping -c1 google.com &>/dev/null;
then
echo "Conexión a internet OK.";
else
echo "No hay conexión.";
fi
Hasta aqui bien, pero y si además necesitamos que se ejecute de nuevo hasta estar conectados? Bien, en ese caso cambiaremos el código por:
#!/bin/bash

# Comprobamos conexión cada 10 segundos.
until ping -c1 google.com &>/dev/null
do
echo "No hay conexión. Reintentando en 5 segundos..."
sleep 5
done
# Hay conexión!
echo "Conexión a internet OK";
De esta forma ejecutaremos el script cada 10 segundos hasta que estemos conectados.
Hasta pronto!

12/9/15

Script para mostrar la información de nuestro disco duro.

El enunciado lo dice todo. Es un código que encontré que he creido que puede ser de utilidad a alguién. Un código cortito y muy rápio en ejecución.

[code language="perl"]
#!/usr/bin/perl -w
# zfree.pl es un script que utiliza la lista de diálogo zenity para mostrar
# la información libre en el disco duro

my @df = qx "df -h";
my $cl = "zenity --list --width=500 --height=280 --title=\"Espacio libre en disco\" --text=\"Espacio utilizado y libre en los discos duros montados\" ";
my @cols = split /\s+/,$df[0];
shift @df;
pop @cols;
foreach(@cols){
$cl .= "--column=\"$_\" ";
}
@cols = ();
foreach (@df){
@cols = split /\s+/;
foreach(@cols){
$cl .= "\"$_\" ";
}
}system $cl;
exit;[/code]

Hasta el proximo script!

11/9/15

MAME script (I) - Lanzador de juegos arcade.

Todos conocemos la plataforma MAME (o Multiple Arcade Machine Emulator), pero ultimamente han desaparecido muchos programas que gestionaban mediante interfaz gŕafica nuestras roms.
Como siempre, marqué como objetivo un script que fuera liviano y para esto utilizé Zenity como interfaz gráfica. Me puse manos a la obra y desarrolle un script muy pequeño que quedó tal que así:
#!/bin/bash
# MAME script v0.01
# Autor: Esteban C. Sanz
# dependencias: zenity sldmame

DIRECTORIO=~/roms

while : ; do

OUTPUT=$(
for ARCHIVO in `ls $DIRECTORIO/*zip`
do 
ROM=`basename $ARCHIVO .zip`
NOMBRE=`sdlmame -ll $ROM | awk -F\" '/\".*\"/ {print $2}' | tr -d "'"`
echo $ROM  # Columna "Rom"
echo $NOMBRE # Columna "Juego"
done | zenity --list \
--width=550 \
--height=500 \
--title="Juegos MAME" \
--column="Rom" \
--column="Juego";
)

if [ $? -eq 1 ]; then break; else
sdlmame $DIRECTORIO/$OUTPUT.zip
fi 

done
En la línea 4 pasamos como variable la carpeta conde estan nuestras roms. En mi caso esta ubicada en el raíz de HOME con el nombre "roms" (sin comillas). Cada cual debe de asignar a DIRECTORIO la ruta de la carpeta donde tenga sus roms.
Por ejemplo, si tenemos las roms en HOME/juegos/mame roms/ declararemos DIRECTORIO de la siguiente forma: DIRECTORIO=~/juegos/mame roms ¿Facil, no?
Luego lo guardamos como mame_script.sh y le damos permisos de ejecución con:
chmod +x /ruta del archivo/mame_script.sh
Ya podemos lanzar nuestras roms ejecutando: /ruta del archivo/mame_script.sh
Les dejo un par de enlaces a las principales páginas para poder descargar sus roms:

Rom-World.com http://www.rom-world.com/dl.php?name=MAME
Coolrom.com http://www.coolrom.com/roms/
Un saludo!

2/9/15

"Radio" - Script para escuchar la radio online.

He creado este pequeño script, como siempre, usando Zenity como interfaz y Mplayer como reproductor (aunque podremos poner otro que se nos ocurra). Las URLs de streaming las he buscado en la red, son las principales radios españolas y alguna que otra emisora on-line.
Dicho esto tendremos instalar dichas dependencias, de lo contrario abrimos nuestro terminar y ejecutaremos la siguiente orden:
sudo pacman -S zenity mlpayer
Copiaremos el script en un archivo de texto con Leafpad, Mousepad o similar:
#!/bin/bash
# Radio 0.2
# Autor: Esteban C. Sanz
# Dependencias: zenity, mplayer

PLAYER=$(which mplayer 2>/dev/null)

function play()
{
clear
echo -e "\n\tPara volver al menu principal, pulse ENTER\n\n"; 
sleep 2 && "$PLAYER" 2>/dev/null "$1"
}

while : ; do
RADIO=$(zenity --list \
--title="Radio 0.1" \
--column="Emisoras" --width=300 --height=400 \
"Los 40 principales" \
"M80" \
"Cadena SER" \
"Cadena Dial" \
"Europa FM" \
"Hit FM" \
"Máxima FM" \
"Loca FM" \
"IbizaPartyRadio" \
"Ibiza Sonica Radio" \
"Formula Hit" \
"&Radio" \
"FrenchKissFM" \
"Indie Pop Rocks!" \
"FM Absolute 70's Pop" \
"FM Absolute 90's" \
"FM Absolute Pop Latino" \
"FM Absolute Samba" \
)

if [ $? -eq 0 ]; then
case $RADIO in 

"Los 40 principales")     play "http://10883.live.streamtheworld.com:3690/LOS40AAC_SC?DIST=TuneIn&TGT=TuneIn&gender=f";;
"M80")                    play "http://13413.live.streamtheworld.com:80/M80RADIOAAC_SC?DIST=TuneIn&TGT=TuneIn&gender=f";;
"Cadena SER")             play "http://194.169.201.177:8085/liveser.mp3";;
"Cadena Dial")            play "http://5293.live.streamtheworld.com:80/CADENADIALAAC_SC?DIST=TuneIn&TGT=TuneIn&gender=f";;
"Europa FM")        play "http://stream.irratia.net:8000/;";;
"Hit FM")            play "http://hitfm.es.audio1.glb.ipercast.net:8000/hitfm.es/mp3";;
"Máxima FM")              play "http://10913.live.streamtheworld.com:80/MAXIMAFM_SC?DIST=TuneIn&TGT=TuneIn&gender=f";;
"Loca FM")                play "http://audio-online.net:23500/";;
"IbizaPartyRadio")        play "http://listen.radionomy.com/ibiza-party-radio";;
"Ibiza Sonica Radio")   play "http://www.ibizasonica.com/html5player/balanceador/sonica.php?file=listen.mp3";;
"Formula Hit")            play "http://server1.emitironline.com:9400/formulahit";;
"&Radio")                 play "http://107.181.225.210:8000/iradio";;
"FrenchKissFM")           play "http://stream.frenchkissfm.com:80";;
"Indie Pop Rocks!")       play "http://xstream1.somafm.com:8090";;
"FM Absolute 70's Pop")   play "http://sc-70s-128kmp3.1.fm";;
"FM Absolute 90's")       play "http://sc-90s-128kmp3.1.fm";;
"FM Absolute Pop Latino") play "http://185.33.22.13:10060";;
"FM Absolute Samba")      play "http://185.33.22.21:10020";;

esac
else
if [ -z $RADIO ]; then
break
fi    
fi
done
Hasta aquí la versión 0.2.
He actualizado el script añadiendo nuevas funciones y emisoras. La nueva versión comprueba las dependencias faltantes y las instala en caso de no tenerlas.
#!/bin/bash
#Radio 0.3
#-----------------------------------------------------------------------
dependencias=(zenity mplayer xdotool)
for item in ${dependencias[*]}
do
    if ! (pacman -Q $item >/dev/null); then lista=$lista" "$item; fi
done
USUARIO=`whoami`; if [ -n "$lista" ]; then echo $USUARIO | sudo -S pacman -S $lista --noconfirm; fi
#-----------------------------------------------------------------------
# Comprobamos conexión cada 5 segundos.
until ping -c1 google.com &>/dev/null
do
  echo "No hay conexión. Reintentando..."; sleep 5
done
#-----------------------------------------------------------------------
function centrar()
{
  w=$(stty size | cut -d" " -f2)       # Ancho del terminal
  l=${#1}                              # Longitud del texto
  printf "%"$((l+(w-l)/2))"s\n" "$1"   # Imprime cadena con el ancho adecuado (%Ws)
}
#-----------------------------------------------------------------------
function play(){
lxterminal -e reset; echo; centrar "$emisora - Para volver al menu principal, pulse ENTER"; echo 
  sleep 2; xdotool windowminimize $(xdotool getactivewindow) # Minimizamos ventana
  "$(which mplayer 2>/dev/null)" 2>/dev/null "$1"
}
#-----------------------------------------------------------------------
reset
while : 
do
  emisora=$(zenity --list \
  --title="Radio 0.3" \
  --window-icon=$(dirname $0)/icono.png \
  --column="Emisoras" \
  --width=300 \
  --height=400 \
  "Los 40 principales" \
  "M80" \
  "RockFM" \
  "Europa FM" \
  "RNE" \
  "Radio 3 RNE" \
  "Radio 5 RNE" \
  "Radio Clásica RNE" \
  "Cadena 100" \
  "Cadena Dial" \
  "Cadena SER" \
  "Onda Cero" \
  "Cadena COPE" \
  "Máxima FM" \
  "Hit FM" \
  "Loca FM" \
  "Canal Sur Radio" \
  "Canal Fiesta Radio" \
  "Radiolé" \
  "IbizaPartyRadio" \
  "Ibiza Sonica Radio" \
  "Formula Hit" \
  "&Radio" \
  "FrenchKissFM" \
  "Indie Pop Rocks!" \
  "FM Absolute 70's Pop" \
  "FM Absolute 90's" \
  "FM Absolute Pop Latino" \
  "FM Absolute Samba" \
  )
  if [ $? -eq 0 ]
  then
    case $emisora in 
      "Los 40 principales") play "http://10883.live.streamtheworld.com:3690/LOS40AAC_SC?DIST=TuneIn&TGT=TuneIn&gender=f";;
      "M80")   play "http://13413.live.streamtheworld.com:80/M80RADIO_SC";;
      "RockFM")   play "http://195.10.2.97/cope/rockfm.mp3?GKID=204d1d9ed95711e5a5e600163ea2c744&fspref=aHR0cDovL3d3dy55b3VybXV6ZS5mbS9zdGF0aW9uL3JvY2stZm0tZXNwYSVDMyVCMWEtMg%3D%3D";;
      "Europa FM")  play "http://stream.irratia.net:8000/;";;
      "RNE")   play "http://195.55.74.205/rtve/radio1.mp3?GKID=579a4c1ed95b11e5a9f500163e914f69";;
      "Radio 3 RNE")  play "http://195.55.74.208/rtve/radio3.mp3?GKID=8e10a39cd95b11e5a5e600163ea2c744";;
      "Radio 5 RNE")  play "http://195.55.74.208/rtve/radio5.mp3";;
      "Radio Clásica RNE") play "http://195.55.74.205/rtve/radioclasica.mp3?GKID=c042b29cd95b11e5a9f500163e914f69";;
      "Cadena 100")  play "http://195.55.74.209/cope/cadena100-low.mp3?GKID=cad2ca84608a11e5a33700163e914f69";;
      "Cadena Dial")  play "http://5293.live.streamtheworld.com:80/CADENADIALAAC_SC?DIST=TuneIn&TGT=TuneIn&gender=f";;
      "Cadena SER")  play "http://194.169.201.177:8085/liveser.mp3";;
      "Onda Cero")  play "http://ns2.streaming-live.es:8005/live";;
      "Cadena COPE")  play "http://195.10.2.95/copesedes/madrid.mp3";;
      "Máxima FM")  play "http://10913.live.streamtheworld.com:80/MAXIMAFM_SC?DIST=TuneIn&TGT=TuneIn&gender=f";;
      "Hit FM")   play "http://hitfm.es.audio1.glb.ipercast.net:8000/hitfm.es/mp3";;
      "Loca FM")  play "http://audio-online.net:23500/";;
      "Canal Sur Radio") play "http://195.55.74.212/rtva/canalsurradio_master.mp3?GKID=02dba63460a011e5bb2000163ea2c744";;
      "Canal Fiesta Radio") play "http://195.10.10.222/rtva/canalfiestaradio_master.mp3?GKID=a59517f8609f11e5bb2000163ea2c744";;
      "Radiolé")  play "http://10913.live.streamtheworld.com:3690/RADIOLEAAC_SC?DIST=TuneIn&TGT=TuneIn&gender=f";;
      "IbizaPartyRadio") play "http://listen.radionomy.com/ibiza-party-radio";;
      "Ibiza Sonica Radio") play "http://www.ibizasonica.com/html5player/balanceador/sonica.php?file=listen.mp3";;
      "Formula Hit")  play "http://server1.emitironline.com:9400/formulahit";;
      "&Radio")   play "";;
      "FrenchKissFM")  play "http://stream.frenchkissfm.com:80";;
      "Indie Pop Rocks!") play "";;
      "FM Absolute 70's Pop") play "http://sc-70s-128kmp3.1.fm";;
      "FM Absolute 90's") play "http://sc-90s-128kmp3.1.fm";;
      "FM Absolute Pop Latino") play "http://185.33.22.13:10060";;
      "FM Absolute Samba") play "http://185.33.22.21:10020";;
    esac
  else
    if [ -z $emisora ]
    then
      break
    fi    
  fi
done
Luego lo guardamos como radio.sh y le damos permisos de ejecución con:
chmod +x /ruta del archivo/raido.sh
y listo! ya podremos disfrutar de la música o vuestro programa favorito.
La lista de las puede ampliarse con vuestra colaboración!
Pondré las URLs de streaming que reciba para implementarlas en el script e ir así ampliándolo.
Una vez más, espero que os sirva!
Hasta el próximo post!