Raspberry Pi: torrentbox automatica

Nel precedente post ho spiegato cos’è un Raspberry Pi e come installare il necessario per farlo funzionare. E ora? E ora vediamo come realizzare una torrentbox, o download hub, o come vi pare a voi: un computer che scarica torrent e lo fa in maniera automatica.

– Ehi Jeby, ma scaricare Torrent non è illegale?

Mio puntigliosissimo amico, la risposta è che dipende da cosa scarichi, in generale scaricare torrent non è illegale, ciò che è illegale è condividere e diffondere materiale coperto da copyright, come ci dice l’articolo 171-ter della Legge del 22 aprile 1941 n° 633.

– Ehi Jeby, ma allora la tassa sul giga che paghiamo come equo compenso alla SIAE?

Ehm… beh, non addentriamoci oltre… dopo il disclaimer sulla legalità, manca solo quello per porre attenzione sui rischi delle procedure qui illustrate: userete un sacco di sudo seguiti da comandi strani, fate attenzione o rischiate di far danni 😉

Detto ciò, ecco una serie di appunti utili per realizzare la download station torrent box o quel che vi pare, utilizzando un Raspberry Pi connesso al router e con appiccicato un HD usb o un disco di rete Samba, il tutto senza monitor e senza tastiera, così da ridurre al minimo l’interazione ed evitare gli sprechi.

Lo schema sarà più o meno questo: vedremo come montare un HD o un disco di rete su cui scaricare torrent tramite Transmission e automatizzare il download attraverso Flexget.

Login Automatico

Dato che il Pi verrà utilizzato senza periferiche di input, dobbiamo fare in modo che il login dell’utente principale avvenga automaticamente, senza bisogno ogni volta di loggarci a mano. Questo potrebbe essere un problema di sicurezza nel caso qualcuno entrasse in casa vostra e decidesse di collegare improvvisamente un monitor e una tastiera al Pi 😀

Rinchiuso il Pi nella cassaforte, assumendo che il vostro utente principale si chiami Pi (o anche no) e che il vostro sistema sia Raspbian (o anche no) ecco cosa dovete fare.

  1. Raggiungete via SSH il vostro Pi
  2. digitate sul terminale il comando sudo nano /etc/inittab . Nano è un text editor utilizzabile da riga di comando
  3. Scorrete giù (usando le frecce o ctrl+V) fino ad individuare una linea che fa più o meno così: 1:2345:respawn:/sbin/getty 115200 tty1
  4. aggiungete un # prima di 1:2345:respawn:/sbin/getty 115200 tty1
  5. appena sotto questa linea aggiungete questa (vale il copia e incolla, ma attenti alle combinazione di tasti di Nano) 1:2345:respawn:/bin/login -f pi tty1 </dev/tty1 >/dev/tty1 2>&1
  6. Usate la combinazione di tasti ctrl+X per uscire da Nano e quindi digitate y (o s) per salvare il file

Fatto!

Montare un disco esterno

Come si monta un disco sul RasPi? Dipende. Partiamo dal presupposto che vogliate appiccicare un disco USB. In questo caso avete due opzioni a livello “hardware”:

  1. Avete un disco esterno dotato di alimentatore di corrente
  2. Avete un disco da 2.5″ alimentato via USB: in questo caso dovete avere un hub USB dotato di alimentatore di corrente

questo perché il RasPi di per sé si ciuccia gran parte della corrente che gli arriva dall’alimentatore e alle porte USB dà solo i canonici 500 mAh che non sono sufficienti a far girare gli HD esterni.

Ammesso che il disco abbia la corrente di cui ha bisogno, collegatelo all’usb e verificate il nome del dispositivo. In Raspbian il dispositivo verrà mostrato in /dev/sd*$ dove * è una lettera che indica il numero di dispositivi usb collegati, mentre $ è il numero delle partizioni sul disco usb. Ad esempio un disco con 2 partizioni comparirà in /dev/sda1 e /dev/sda2. Per visualizzare i dischi collegati usate il comando:

sudo blkid

In /dev viene mostrato l’hardware e la sua gerarchia, ma non si possono fare operazioni sui file o accedervi. Per farlo bisogna creare un “punto di mount”, ovvero una cartella vuota in cui verrà rappresentato il contenuto del disco che sarà dunque accessibile. Quindi, create una cartella dove vi pare, il posto più “intelligente” sarebbe creare una sottocartella in /media o in /mnt ma voi potete crearla dove vi pare. Per farlo, usate il comando:

sudo mkdir /mnt/comevipare

fatto ciò, montare la partizione 1 del primo disco usb inserito è un gioco da ragazzi e si fa così:

sudo mount -o uid=pi,gid=pi /dev/sda1 /mnt/comevipare

/dev/sda1 è l’hardware da montare, /mnt/comevipare è il punto di mount, uid e gid sono gli identificativi dell’utente e del gruppo a cui consentire le operazioni di “mount” del disco e se non avete fatto nulla di strano coincidono con quelli predefiniti sul pi. Ovviamente, modificate il comando secondo le vostre esigenze. Fatto ciò, navigando in /mnt/comevipare potete vederne il contenuto e smanacciarci dentro.

Cosa manca? Volete che il disco sia caricato al boot. Niente di più facile. Se digitate

sudo nano /etc/fstab

vi apparirà la tabella delle partizioni a cui dovete aggiungere una riga tipo questa:

/dev/sda1 /mnt/comevipare ntfs rw,defaults 0 0

in questo caso, quello a cui bisogna fare attenzione è il tipo di filesystem. Io ho scritto ntfs e va bene nel caso montiate un disco formattato in ntfs, ma potrebbe essere fat, ext2, ext3 o altro. I tipi di filesystem disponibili in fstab sono:

ext2 ext3 ext4 reiserfs xfs jfs smbfs iso9660 vfat ntfs swap auto

ce ne sono anche altri. L’opzione rw invece assicura i diritti di lettura e scrittura.

Attenzione: se il disco è formattato ntfs, dovrete installare i relativi driver per la lettura:

apt-get install ntfs-3g

Dubbi? Domande? usate google o approfondite qui. Ora avete un disco dove scaricare la robaccia via torrent.

Se volete montare un disco SMB, c’è qualche passo in più. Prima di cominciare: ovviamente il disco deve essere accessibile al RasPi in qualche modo, attraverso il network locale. Quindi, poniamo che il disco di rete sia accessibile ad un indirizzo tipo 191.168.0.111 e che vogliate montare la cartella DISCO_RETE che sta in cima all’albero gerarchico. Insomma quello che volete raggiungere è tutto ciò che sta dentro a 192.168.0.111/DISCO_RETE.

Bisogna in primo luogo creare un file che contiene le credenziali di accesso al disco di rete. Potete crearlo dove volete, la cosa più (s)comoda è crearlo in una cartella di sistema dove difficilmente vi ritroverete a smanacciare. Esempio:

sudo mkdir /root/smb/
sudo chmod 700 /root/smb/
sudo nano /root/smb/credentials

dentro il file credentials dovete scrivere:

username=nomeutente_della_condivisione_samba
password=password_della_condivisione_samba

salvate e ora create la directory di mount. Può essere ovunque, ad esempio:

sudo mkdir /media/sambashare

adesso è il turno di modificare il file fstab:

sudo nano /etc/fstab

a cui andrete ad aggiungere la seguente riga

//192.168.0.111/DISCO /media/sambashare cifs credentials=/root/smb/credentials,sec=ntlm,rw,iocharset=utf8,uid=1000,gid=1000 0 0

dove vedete ovviamente uno schema simile a quello già visto in precedenza per montare il disco USB. Quello che cambia è che stavolta il device da montare è un disco di rete e il filesystem è cifs. Va inoltre specificato il file delle credenziali. L’user id e group id (uid gid) sono gli stessi di prima: invece che 1000 potete anche scrivere pi in entrambi i casi, 1000 vuol dire solo che è il primo utente, e probabilmente l’unico sul vostro RasPi.

L’opzione sec=ntlm indica il tipo di “security mode” e sarebbe ridondante, poiché ntlm è il valore default, però dopo l’ultimo aggiornamento del sistema senza questa opzione il mount del disco di rete fallisce sul mio RasPi. Per provare se tutto funziona fate

sudo mount -a

e verificate che nella cartella /media/sambashare ci sia tutto quello che vi serve

ls -la /media/sambashare

Perfetto. Se volete approfondire il discorso SMB e fstab, fate un salto qui, mentre per approfondire le opzioni di mount dei filesystem CIFS date un occhiata al manuale di mount.cifs.

Installare Python-dev

Perché installare Python? Perché sì. O anche perché tre quarti degli script e dei software per quello che volete fare sul Pi sono fatti con Python. In realtà Python è già installato, quello che vi serve sono i dev tools. Perché? Per avere dei sistemi di installazione facili e veloci. Installeremo anche i setuptools, come giustamente ci suggerisce Herick nei commenti. Si fa così:

sudo apt-get install python-dev
sudo apt-get install python-setuptools

Fine. Adesso potete installare pip, ovvero un sistema di gestione ed installazione dei pacchetti python molto intelligente, più intelligente dell easy_install che avete a disposizione dopo aver installato i dev tools di python. Per installare pip si fa così:

sudo easy_install pip

OPTIONAL: installare Virtualenv  (molto consigliato)

Fatto questo forse vorrete installare Virtualenv. Che cos’è virtualenv? Per dirla brutalmente, è uno strumento con cui creare ambienti di librerie python “ermetici”. È utile quando volete installare tanti programmi scritti in python che hanno bisogno delle stesse librerie ma aggiornate a versioni diverse. Ad esempio mettiamo che il software Pippo abbia bisogno della libreria Pluto con numero di versione <=2. Installando Pippo, il sistema di gestione installerà anche Pluto 1.9. Poi metti caso che vuoi installare anche topolino, che però vuole Pippo in versione >= 2. Allora il sistema sovrascriverà la vecchia installazione di Pluto aggiornandola alla 2.3 ed ecco che Pippo darà errore ogni volta che lo fate girare. Soluzione? Si duplica. Virtualenv creerà degli “ambienti virtuali” (delle cartelle) contententi python nella versione che vi pare e tutte le librerie e dipendenze necessarie per il software che ci andate ad installare, senza che queste vadano ad intaccare le installazioni globali o quelle in altri ambienti. Vediamo cosa significa e come fare. Per prima cosa si installa virtualenv

sudo pip install virtualenv

quindi si crea la cartella degli “ambienti”. Per esempio, mettendo caso che vi troviate al percorso della vostra home:

mkdir envs

che creerà la cartella /home/pi/envs. Quindi si usa virtualenv per creeare gli ambienti, così:

sudo virtualenv --distribute envs/pippo
sudo virtualenv --distribute envs/topo

a questo punto dentro ogni ambiente potete installare il programma desiderato. L’unico modo per essere sicuri di stare installando nell’ambiente giusto è richiamare pip (o easy_install) con il suo percorso assoluto:

sudo /home/pi/envs/pippo/bin/pip install Pippo
sudo /home/pi/envs/topo/bin/pip install Topolino

ogni volta che vorrete richiamare “Pippo” lo dovete far richiamando il percorso completo

/home/pi/envs/pippo/bin/pippo

o quel che è.

C’è anche un altro modo più comodo per attivare l’ambiente, ovvero il comando source:

source envs/pippo/bin/activate

in questo modo non dovete più richiamare il percorso completo. Purtroppo spesso non funziona, sul mio RasPi non funziona mai. Il primo metodo è più noioso ma funziona sempre 😉

Adesso, se volete, potete installare tutti i software Python che volete in questa cartella. Tra gli altri, ad esempio, tvnamer e subliminal (che hanno dipendenze simili ma con versioni discordanti)

Bisogna dire che virtualenv duplica solo se è necessario. La maggior parte delle librerie viene semplicemente linkata con un symlink a quelle di sistema. Per approfondire virtualenv potete partire da qui o ancora meglio da qui.

Installare Transmission-daemon e Transmissionrpc

Transmission è il client BitTorrent più semplice e funzionale oggi disponibile. Nasce come software solo per Mac ma la sua progettazione azzeccata ha fatto sì che si sia evoluto e diffuso grandemente in tutto il mondo *nix e non solo. Noi andremo ad installare un “demone” di transmission, ovvero un programma che gira in background senza interfaccia grafica. Per avere il controllo della situazione ci serviremo, da remoto, di un’interfaccia web o di un’app, entrambe raggiungibili dopo aver installato l’apposito modulo sul RasPi.

Per prima cosa installiamo il demone:

sudo apt-get install transmission-daemon

e aggiungiamo l’account transmission-daemon a quelli associati al nostro utente:

sudo usermod -a -G debian-transmission pi

dove “pi” è l’utente del RasPi

fatto ciò, andiamo a creare delle cartelle in cui poter scaricare i file completi e gli incompleti. Le mettiamo sul disco USB o su quello di rete mettendo a posto anche i permessi di lettura e scrittura, insomma una cosa del genere:

sudo mkdir /mnt/dovevipare/complete
sudo mkdir /mnt/dovevipare/incomplete
sudo chmod 770 /mnt/dovevipare/complete
sudo chmod 770 /mnt/dovevipare/incomplete

ok, ora facciamo partire il demone di transmission e poi blocchiamolo nuovamente:

sudo service transmission-daemon start
sudo service transmission-daemon stop

in questo modo il demone ha creato i vari file di configurazione, tra cui il file in cui inserire le nostre preferenze. Si tratta di un file di testo, o meglio un file “json” e si modifica digitando:

sudo nano /etc/transmission-daemon/settings.json

ci sono un sacco di voci preimpostate, la struttura del file e il significato delle voci si possono trovare qui. Quello che interessa a noi è dire al programma dove scaricare le cose ed eventualmente aggiungere un nome utente e password con cui proteggere l’accesso all’interfaccia web. Le cose da modificare sono:

download-dir: /mnt/dovevipare/complete
incomplete-dir: /mnt/dovevipare/incomplete
incomplete-dir-enabled: true
peer-port-random-on-start: true
rpc-password: passwordascelta
rpc-username: ilnomeutente
rpc-whitelist-enabled: false

ok, ora potete far ripartire il demone:

sudo service transmission-daemon start

e da qualunque browser web potete andare su indirizzopi:9091/transmission/web/ e avere un’interfaccia di controllo del demone che gira sul Pi: “indirizzopi” sarà una cosa del tipo 192.168.0.222 se siete dentro alla rete domestica, ma con servizi di routing del DNS dinamico (tipo: dynDNS) e aprendo le porte giuste sul router, potete accedervi anche da fuori dalla rete domestica.

L’unica cosa che manca è installare il modulo python transmissionrpc. Questo serve per dare accesso al demone ad applicazioni di terze parti, tra cui applicazioni di interfaccia remota, come ad esempio transmission remote gui sul desktop o Gearshift su Android, ma anche il software per l’automazione dei download, Flexget, che installeremo tra poco. Installare transmissionrpc è facile come un

sudo pip install transmissionrpc

ecco fatto, tutto pronto. Tente presente che di default il demone di transmission si avvierà al boot, c’è un apposito script in /etc/init.d già configurato per voi 🙂

Installare Flexget

Siamo arrivati quasi alla fine. Che cos’è Flexget? Flexget è un software meraviglioso che fa quello che io ho sempre sognato: prende automaticamente roba da varie sorgenti, la filtra secondo le nostre esigenze, e la dà in pasto ad  un programma per l’ottenimento dei contenuti. Detta così fa schifo, riprovo citando il sito ufficiale:

FlexGet is a multipurpose automation tool for content like torrents, nzbs, podcasts, comics, series, movies, etc. It can use different kinds of sources like RSS-feeds, html pages, csv files, search engines and there are even plugins for sites that do not provide any kind of useful feeds.

Esempio idiota: andate su un qualunque torrent tracker e cercate Ubuntu. Prendete il feed rss della ricerca e inseritelo nel file di configurazione di Flexget, dite a Flexget di scaricare tramite Transmission e ora, se tutto funziona, ogni volta che spunta una nuova distribuzione di Ubuntu su quel tracker, Transmission la scaricherà. Sostituite il feed di ricerca di Ubuntu con quello che vi fornisce ad esempio ShowRSS e pensate a cosa potrebbe succedere.

Per fare sì che la magia funzioni bisogna per prima cosa installare Flexget e poi modificare il file di configurazione. Installare Flexget è banale:

sudo pip install flexget

la modifica del file di configurazione è da mal di testa! Qui c’è una guida passo passo, mentre qui ci sono delle “ricette” già pronte. Io vi faccio vedere una configurazione semplicissima per scaricare via torrent tutto quello che proviene da un feed rss contenente torrent. Il file va creato in una cartella che di default è si chiama .flexget e sta nascosta nella home del pi. Potete crearla così:

sudo mkdir /home/pi/.flexget

il passo dopo è creare e riempire il file di configurazione:

nano /home/pi/.flexget/config.yml

dentro ci va qualcosa del genere:

schedules:
- tasks: [task1, task2, task3....]
interval:
hours: 3

– tasks: task5
interval:
weeks: 1

tasks:
task1:
rss: http://blablabla/vostrolink/rss
accept_all: yes

transmission:
host: localhost
port: 9091
username: nomeutente_transmission
password: password_transmission

il file così com’è non funziona!!!! Però vi dà una traccia di come può essere impostato il file di configurazione.

C’è una prima parte che assegna gli intervalli di esecuzione dei vari task e poi una parte in cui vengono elencati i task. Ad ogni compito bisogna assegnare un nome, un input (in questo caso gli rss), un filtro (o nessuno, accettando ogni contenuto) e un output, ad esempio indirizzando il risultato del filtro a Transmission.

Ci sono in realtà miliardi di cose che potete fare con Flexget, moltissimi filtri, tipi di input e così via. Vi consiglio vivamente di dare un’occhiata alla pagina dei plugin e alle pagine di tutti i plugin elencati, a quella della configurazione e alle ricette già pronte. C’è un mondo da scoprire!

Per controllare che il file di configurazione si formattato correttamente (attenti a come indentate!!!) potete dare il comando

flexget check

e se tutto è ok potete fare un test

flexget --test execute

e quindi far partire / verificare / fermare il demone di flexget

flexget daemon start -d
flexget daemon status
flexget daemon stop

Se volete far partire automaticamente il demone di Flexget al boot potete farlo modificando la tabella di cron

crontab -e

aggiungendo una riga come questa

@reboot flexget daemon start -d > /dev/null 2>&1

probabilmente c’è un modo più elegante ma io non lo conosco.

Fate attenzione che se (come me) avete installato Flexget in virtualenv, ogni volta che richiamate  il comando flexget lo dovete fare attraverso il suo percorso completo, quindi ad esempio invece di

@reboot flexget daemon start -d > /dev/null 2>&1

avrete

@reboot /home/pi/envs/flexget/bin/flexget daemon start -d > /dev/null 2>&1

e così via 🙂

Conclusioni

In questo post avete visto come sia possibile effettuare il login automatico al RasPi, montare dischi USB e dischi condivisi attraverso il protocollo SMB e avete visto come sia possibile installare Transmission, controllarlo da remoto, e utilizzare Flexget per automatizzare lo scaricamento dei contenuti. A latere, è stato presentato virtualenv come metodo per non incasinare le installazioni di software python, come ad esempio subliminal, tvnamer o lo stesso Flexget. Si tratta più che altro di appunti e non di una guida completa ed esaustiva: sta a voi approfondire, sperimentare e magari commentare aggiungendo suggerimenti e modifiche.

Nella prossima puntata: minidlna!

’nuff said