Archive for septiembre 17, 2008
Servidor de streaming mt-daap
Después de configurar NFS en Mac OS X aproveché para montar un servidor de streaming de audio, en concreto voy a usar el protocolo Daap. El servidor correrá en una Debian y los clientes, pues cualquiera que soporte este protocolo, iTunes por supuesto, pero también hay libres como Rhythmbox o Amarok.
En primer lugar hace falta avahi-daemon, un demonio que realiza multicast DNS para publicar/descubrir servicios, en nuestro caso publicaremos el servidor daap y los clientes tendrán que descubrirlo, por tanto hace falta en todas las máquinas. En teoría mt-daapd trae su propia implementación para hacer multicast DNS pero parece que funciona mejor con avahi.
Por tanto en el servidor instalamos los paquetes:
# apt-get install mt-daapd avahi-daemon avahi-utils libnss-mdns
Configuración de avahi-daemon.
Editamos el fichero /etc/default/avahi-daemon y nos cercioramos que la variable AVAHI_DAEMON_START esté seteada a 1, esto hará que el demonio arranque al inicio del sistema, en Debian viene por defecto.
# 0 = don’t start, 1 = start
AVAHI_DAEMON_START=1
Para que la resolución de nombres se realice correctamente con mdns tenemos que editar el fichero /etc/nsswitch.conf y donde aparece:
hosts: files dns
sustituimos por:
hosts: files dns mdns4_minimal mdns4
Avahi utiliza ficheros con formato XML para la configuración los servicios, en nuestro caso el fichero en cuestión es éste:
<?xml version="1.0" standalone='no'?> <!DOCTYPE service-group SYSTEM "avahi-service.dtd"> <service-group> <name>Servidor iTunes</name> <service> <type>_daap._tcp</type> <port>3689</port> </service> </service-group>
Su nombre será daap.service e irá en /etc/avahi/services/
Configuración de mt-daapd.
Editamos el fichero de configuración /etc/mt-daapd.conf las opciones mas interesantes son:
# Contraseña de la interfaz web de mt-daap.
admin_pw =1234
# Directorio donde está la musica.
mp3_dir = /home/shared/Musica
# Usuario con el que correrá mt-daap
runas = mt-daapd
# Nombre del servidor
servername = Servidor iTunes
El logfile por defecto está desactivado, es decir, no hay fichero de log, cualquiera que halla usado un poco linux sabe que es importante que la aplicación vuelque sus mensajes a logs, cuantos errores no he resuelto gracias a los logs que si no me hubiese sido imposible. Por tanto lo activamos.
logfile = /var/log/mt-daapd.log
Reiniciamos los servicios:
# /etc/init.d/dbus restart
Esto reiniciará dbus y avahi.
Arrancamos manualmente mt-daapd:
# mt-daapd -m -f -d 5
-m para que no haga multicast dns, ya lo hace avahi.
-f para que nos vaya mostrando por pantalla el debug.
-d 5 el nivel de debug.
Hay que retocar el script del servicio para que cuando arranque por defecto no haga multicast dns, editamos el fichero /etc/init.d/mt-daapd y añadimos DAEMON_OPTS=»-m» tal que así:
#! /bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/sbin/mt-daapd
NAME=mt-daapd
DESC=mt-daapd
DAEMON_OPTS=»-m»
test -x $DAEMON || exit 0
….
No hay que modificar mas nada, así que guardamos.
Configuración de los clientes. ArchLinux y Mac OS X.
En arch instalamos avahi y dbus:
# pacman -S avahi dbus
Iniciamos dbus:
# /etc/rc.d/dbus start
Iniciamos avahi:
# avahi-daemon
Ahora si abrimos nuestro reproductor nos debe aparecer el servidor, por ejemplo en Rhythmbox:
Hay que tener en cuenta que dbus y avahi deben arrancar al inicio, en Arch basta con añadirlo a DAEMONS(… dbus avahi-daemon …) en el fichero /etc/rc.conf ademas en ese orden pues avahi no arranca sin dbus.
En Mac OS X no hay que hacer casi nada, sólo tener marcada la opción «Buscar bibliotecas compartidas» en el menú Preferencias de iTunes y ya nos aparece el servidor:
Haciendo Streaming fuera de nuestra red.
El protocolo sólo hace streaming para nuestra subred, si estamos fuera de ella tendremos que hacer una triquiñuela. Como migranpipa está accesible siempre desde internet lo que haremos es un túnel ssh y utilizaremos un programa llamado Network Beacon que nos hará de proxy y publicará el servicio.
Crear el túnel ssh es sencillo, desde un terminal ejecutamos (por supuesto con tu nombre de usuario y servidor):
ssh oscar@www.migranpipa.net -N -f -L 3689:www.migranpipa.net:3689
Donde:
-N para que el túnel no sea interactivo.
-f envía el proceso a segundo plano.
-L especifica el túnel, en este caso el puerto 3689 local será tunelado al puerto 3689 de la máquina remota http://www.migranpipa.net.
Para eliminar el túnel tan sólo tenemos que matar el proceso.
También se puede hacer de forma gráfica con Fugu, es un universal, asi que lo instalamos simplemente arrastrando el ejecutable al directorio Aplicaciones, lo ejecutamos y en la pestaña «SSH» creamos un «Nuevo túnel SSH»:
Ahora descargamos e instalamos Network Beacon, igual que Fugu, ya que también es universal, lo ejecutamos y creamos un «New Beacon» con la información que corresponda:
Esto se puede hacer desde linea de comandos con Bonjour pero hay que compilar el paquete, por tanto también instalar Xcode, en fin Network Beacon ya nos lo da hecho.
Ahora ya podemos oír música desde todo el mundo, sin embargo tenemos que arrancar Network beacon y crear el túnel al menos cada vez que encendemos el ordenador, esto es un poco engorroso, que mejor que automatizarlo con un AppleScript.
on run do shell script "ssh oscar@www.migranpipa.net -N -f -L 3689:www.migranpipa.net:3689 >/dev/null 2>&1 &" tell application "System Events" to (name of processes) contains "Network Beacon" if the result is false then activate application "Network Beacon" tell application "System Events" set visible of process "Network Beacon" to false end tell end if end run on quit do shell script "killall ssh" tell application "Network Beacon" to quit continue quit end quit
Edita los parámetros correspondientes y guárdalo como Aplicación en Aplicaciones. Pensé en hacer un script y ejecutarlo al inicio del sistema, sería aún mas cómodo ya que no tendríamos que ejecutar nada, pero al final descarté la idea porque eso implica mantener la conexión permanentemente, lo que añade carga innecesaria y resta ancho de banda a ambas máquinas.
Si en vez de Mac tenemos Linux como cliente, haremos lo mismo, creamos el túnel y en vez de Network Beacon utilizaremos RendezvousProxy, se puede también crear un script de bash, mas sencillo que el AppleScript, eso lo dejo como tarea.
Es conveniente tener la autenticación de SSH mediante llaves y passphrase, seguirá siendo seguro y no nos pedirá la contraseña, es muy fácil de hacer, lo explican muy bien aquí.
Con todo esto ya tenemos nuestro servidor mt-daap funcionando y toda nuestra música disponible en cualquier sitio.
Como alternativa (en realidad la alternativa sería mt-daap) podemos montar el servidor libre GNUMP3d ya que mp-daap una implementación del protocolo de Apple, no lo he probado pero he leído que funciona bien, yo utilicé daap porque se integra muy bien con iTunes y Rhythmbox
NOTA: inicialmente hice las pruebas con el MacBook por Wifi, el servidor estaba bien configurado pero iTunes no lo veía hasta que me dio por probar conectándolo mediante cable y ahí si que funcionó, el problema es del router, hay que activar el protocolo Multicast mediante IGMP, sin embargo yo lo activé (ambas versiones), también UPnP y sigue sin funcionar. Si alguien sabe como solucionarlo, que lo comente, mi router es un Zyxel Prestige 650HW, el de Telefónica.
Bueno, decir que en realidad funciona por Wifi pues esté o no en casa uso el túnel ssh, pero me gustaría saber si se puede hacer como debería.
Enlaces interesantes:
http://gentoo-wiki.com/HOWTO_Apple_ITunes_Server