2015/11/21

Choco PI

Motivos: Seguridad, Educación y Bajo consumo


if you want an english version, feel free to ask me for it

Teniendo chicos hay tres caminos:

  • Permitir todo
  • Negar todo
  • Arremangarse


Lo normal es lo primero.

Mi impulso natural es el segundo.

Esta nota y alguna futura forman parte de lo que he hecho en el marco de lo tercero.

Aclaro que no soy pedagogo, esto es resultado de mi experiencia y sentido común.

Permitir todo


Es lo más sencillo. Mirá a tu alrededor y lo verás llevado a la práctica. Niños que no saben aún leer ni escribir manejando una tablet. Está ok, salvo que lo están haciendo en lugar de estar potrereando/andando en bici/patines/skate/pelota/trepar árboles/leer libros. Es la nueva tele.

Yo no estoy libre de pecado, de pequeño y no tanto pasé bastante tiempo jugando a los fichines o la Atari 130 XE, es que era un marginal.

Lo bueno es que aprenden a usar todo. Lo malo, es que a diferencia de los juegos de antes, ahora están conectados a Internet. Antes, cuando yo potrereaba, mis padres, tutores o encargados sabían lo que estaba haciendo pues lo habían hecho en su momento. Ahora, los niños estan "potrereando" en Internet, con adultos desconocidos ("no hables con extraños, no te subas al auto de un desconocido" -> "no chatees con extraños") y sus padres, tutores o encargados no tienen ni la menor idea, incluso hay algunos que ni siquiera potrerearon en el mundo real porque estaban mirando tele.

Negar todo


Lo segundo más fácil, mi impulso natural coherente con que el uso de mobile por menores en mi hogar despierta mi lado más paranóico, a tal punto que los aspectos educativos resultan perjudicados.

Ese es el problema, tampoco queremos analfabetos informáticos.

Un escenario común es "¿Podemos poner música?". Claro, siempre pueden y terminan mirando videos y de ahí está a un click jugar y es más fácil negar de una.

Arremangarse


Para no abandonarles en el ciberespacio ni negárselo, implantaré dos medidas: una, la del presente artículo, para reducir la interacción innecesaria con Internet y la otra, a futuro y en otra nota, la segmentación de la red y su monitoreo.

Puede parecer extremo, pero no tengo ganas de ser parte de una botnet. Tampoco quiero invadir su privacidad y estar mirando lo que hacen.


Teniendo un amplio y disponible almacén musical, ni hace falta pedir permiso y es sencillo restringir por contrato el acceso.


Aprovechando una Raspberry PI Model B, una caja plástica de bombones de chocolate, una adaptador usb/pata, un disco ide, un torno de mano, bastantes cds de música con sus correspondientes backups ripeados, es sólo pensar y trabajar un ratito para tener algo que permita escuchar música de algún modo.


No voy a entrar en detalles tipo instructables, pues las probabilidades de que tengas el mismo hardware que yo son bajísimas. Sólo mencionaré tips, recomendaciones y errores cometidos. Además asumo un conocimiento intermedio de administración linux, el objetivo de todo esto es estimular ideas para que te armes lo tuyo con lo que tengas.


Caminos no tomados


Quería aprovechar una SD Card de 2 GB, donde ya antes había instalado una distro para las pruebas con w3af, pero el esfuerzo de achicar alguna distro para que entre, aunque traería aparejado un brutal incremento de conocimiento, excede el alcance y tiempo de este proyecto, al punto que es más barato comprar SD del tamaño necesario, 8 GB.

Instalar una distro específica de media center que hubiese permitido instarlar en tan sólo 1 GB estuvo considerado, pero tenía que aprender cosas específicas, mejor invertirlo en conocimiento genérico.


Detalles


La idea más completa es esta, pero no implementé todo:

+--------------+         +-------+       +--------+
| Amplificador <--audio--< RBpi  <-------> mpc    |
+------^-------+         | Music |       | ncmpc  |
       |                 | Player|       | android|
       +----------IR-----< Daemon|       +--------+
                         +-^---v-+       

                           |   |           +--------+  
  +------------------------v-+ \-streaming-> http   |
  |smb/sftp/rsync/nfs/webdav |             | client |
  +--------------------------+             +--------+
                                          


Gabinete


Esto es probablemente lo más interesante de esta entrada.

Al cortar el plástico hay que usar una velocidad mas bien baja y no cortar por mucho tiempo, ya que el plástico se calienta, derrite y pega a la herramienta. La década perdida, o más bien, las tres décadas perdidas es no haber tenido antes un dremel, ¡qué lo parió!










Es recomendable pensar bien como van los componentes. Yo me equivoqué con el conector de audio, pues cuando armé el gabinete no había terminado de pensar como lo iba a usar y así fue como tuve que usar un conector de audio a 90° y además tener que sacar la RBpi para poder conectarlo y desconectarlo.

Mas o menos lo pensé en función de los cables y la circulación de aire.



Administración general


Lo más cómodo me ha resultdo ssh -X, que me permite abrir synaptic para instalar lo que necesite. Sólo hace falta conectar a kvm en el primer arranque para configurar la red.



Temperatura

En invierno no hay problemas, pero en verano se puede complicar. El único termómetro disponible es el del disco rígido, pero sensors-detect no lo vé. Mala suerte.



Real Time Clock

Raspberry PI no tiene batería ni RTC, así que hay que configurar correctamente NTP, lo cual parece ok, sólo porque la configuración de la red permite que ChocoPI acceda a Internet. Mmmm, veremos.

Hay que configurar correctamente la TimeZone, ntp viene activo por default.


Green Energy

La mayor parte del tiempo esta máquina está en vano, pero no quiero que se esté prendiendo y apagando. De hecho tiene una RBPI para que tenga bajo consumo. El disco sí me interesaría que se apague cuando sé que va a estar varias horas si uso. Eso se hace con hdparm, pero me complica la vida tanto como prender y apagar todo, así que, otro skip.



Power off


En teoría apagar una máquina debería ser de las cosas mas sencillas, ¿no? Para los que no recuerdan o no estuvieron, hubo un tiempo en el cual había que "aparcar" los cabezales de los discos rígidos antes de apagarlos para evitar que pegaran contra las superficies. Tambien eran los tiempos en que para apagar lo único que había que hacer era... apagar. Ahora hay que avisarle al sistema operativo. Más que avisarle hay que pedirle.

Con este modelo nos quedamos con lo peor de las dos épocas: hay que pedirle al sistema operativo para que apague la RBPI y hay que apagar la fuente a mano, pues el disco rígido está conectado directamente a la fuente.

Aprovechando la capacidad de I/O de la RBPI habría que poner un relé o similar y algún circuitito, pero como la idea es que esté siempre prendida, tiene muy baja prioridad.


Control del amplificador


Uno de estos días, aprovechando los pines de la RBpi, no sé cómo, voy a controlar el amplificador via el remoto infrarojo.

Storage

Primero hay que descubrir dónde aparece el disco

[dmesg]
[    7.223291] scsi 0:0:0:0: Direct-Access     XXX XXXXX          PQ: 0 ANSI: 0
[    7.248541] sd 0:0:0:0: [sda] 488397168 512-byte logical blocks: (250 GB/232 GiB)
[    7.278569] sd 0:0:0:0: [sda] Write Protect is off
[    7.302157] sd 0:0:0:0: [sda] Mode Sense: 33 00 00 00
[    7.365556] sd 0:0:0:0: [sda] Attached SCSI disk


Luego particionarlo con fdisk, formatearlo con mkfs

sudo mkfs.ext4 /dev/sda1

actualizar fstab para que se automonte:


[/etc/fstab]
/dev/sda1       /mnt            ext4    rw,relatime,data=ordered 0 0

y por último copiarle la data, como mas te guste.

MPD

Es el programa que ejecuta los temas con una interfaz remota.

Puse todos sus archivos en el disco usb, /var/lib/mpd a la par de la música y ajusté acorde a la configuración. Ahí también va el streaming.



[/etc/mpd.conf]
music_directory     "/mnt/musica/"
playlist_directory  "/mnt/mpd/playlists"
db_file             "/mnt/mpd/tag_cache"
log_file            "/mnt/mpd/mpd.log"
pid_file            "/run/mpd/pid"
state_file          "/mnt/mpd/state"
sticker_file        "/mnt/mpd/sticker.sql"
user                "mpd"
audio_output {
    type            "alsa"
    name            "My ALSA Device"
}
audio_output {   
    type            "httpd"   
    name            "My HTTP Stream"
    encoder         "lame"    port        "8000"
    bitrate         "128"

    format          "44100:16:1"
}
filesystem_charset  "UTF-8"




File Sharing

Teniendo sshd, ya tenemos SFTP. Cuando tenga tiempo, ganas y necesidad, configuraré smb y nfs de algún modo relativamente seguro.


Sincronización


En mi master de audio, cada tanto ejecuto rsync. El sentido de la confianza indica que no pueda hacer pull desde ChocoPI, en quien confío menos que mi master. No olvidés ejecutar mpd update tras cualquier cambio.

Extensión para FF


Minion, en mi caso no toma el servidor asi que hay que

about:config -> extensions.mpm.server -> ip:port

pero no hay manera de decirle la contraseña.

Metadata


Al igual que cualquier otro player, toma la metadata del archivo, no le interesan los nombres de los archivos o las carpetas contenedoras, lo cual a mi me rompe mucho los pies, pues tengo un esquema muy sencillo:

letra
   nombre.grupo
      año - nombre album
         número - nombre tema

Lo cual no se lleva muy bien con compilados, disc1 y disc2,  ni música clásica.

Si la vida fuera fácil:

ls -1 "$1" | while read interprete; do
  ls -1 "$1/$interprete" | while read disco ; do
    anio=$(echo $disco | cut -d"-" -f 1)
    eldisco=$(echo $disco | cut -d"-" -f 2-)
    ls -1 "$1/$interprete/$disco" | while read tema; do
      pos=$(echo $tema | cut -d"-" -f 1)
      eltema=$(echo $tema | cut -d"-" -f 2)
        id3tool \

          --set-title="$eltema" \
          --set-album="$eldisco" \
          --set-artist="$interprete" \
          --set-year="$anio" \ 
          --set-track="$pos" \
          "$1/$interprete/$disco/$tema"
    done
  done
done


Pero como la vida no es fácil, es otro skip...

Seguridad


Apesta, es por ello que ni me he molestado aún en configurar smb, nfs, http o webdav. MPD tiene passwords, pero, wireshark dice que


OK MPD 0.19.0
status
ACK [4@0] {status} you don't have permission for "status"
password "password"
OK
status
volume: 85
repeat: 0
random: 0
single: 0
consume: 0
playlist: 2
playlistlength: 9
mixrampdb: 0.000000
state: stop
song: 0
songid: 1
nextsong: 1
nextsongid: 2
OK



No hay manera sencilla de corregir esto

 

Links útiles


http://www.musicpd.org/clients/ncmpc/

https://wiki.archlinux.org/index.php/Music_Player_Daemon/Tips_and_tricks

http://www.suntimebox.com/raspberry-pi-tutorial-course/week-3/day-5/

http://daker.me/2014/10/how-to-fix-perl-warning-setting-locale-failed-in-raspbian.html

http://www.musicpd.org/doc/user/

http://mpd.wikia.com/wiki/Music_Player_Daemon_Security

1 comentario: