Per il protocollo bittorrent su Linux ho sempre utilizzato Transmission. Non per un motivo particolare, era il client predefinito installato in gnome... Poi ne ho scoperto alcune feature interessanti tra cui il fatto che questo client ho la possibilità di funzionare anche in modalità daemon, con il controllo tramite interfaccia web. Ancora meglio, di recente ho scoperto che c'è la possibilità di installare direttamente un'interfaccia grafica remota per la connessione e la gestione della modalità daemon in esecuzione su un'altra macchina. In più, questa interfaccia remota è disponibile per Windows, Linux, Mac ed in java, quindi in teoria anche per palmari e smartphone... Si candida pertanto a diventare il client bittorrent perfetto per la mia installazione.
Il contro è che l'ultima versione disponibile nei repository ufficiali di Debian è però la 2.03-2 mentre l'ultima rilasciata come stabile è una 2.33, che tra l'altro sembra implementare qualche bugfix interessante... Inoltre questa versione Transmission richiede una versione della libreria libevent > 2.0.10 e attualmente in debian c'è la 1.4... La 2.0.5 per Debian è in Alpha, si trova nel repository "Experimental". Non molto confortante: Avrei preferito non compilare da sorgenti e forse sarebbe meglio installare una versione più vecchia di transmission ma a questo punto provo...
La procedura che devo seguire è quella indicata per l'installazione in una headless machine.
[EDIT del 23 Giugno 2012:]
Se dovessero servire i .deb già compilati qui ci sono sia il deb di transmission-daemon che delle libreria libevent. Sono quelli che girano sul mio sistema e li aggiungo mano a mano che aggiorno il daemon: è l'unica garanzia che posso dare.
Questi sono i requisiti per compilare e generare il pacchetto .deb da installare per transmission-daemon:
codice:
sudo apt-get install build-essential automake autoconf libtool pkg-config libcurl4-openssl-dev intltool libxml2-dev libgtk2.0-dev libnotify-dev libglib2.0-dev libevent-dev checkinstall
La procedura installa circa 250mb di librerie e tools...
Ho trovato questa guida per ubuntu, che fà esattamente quello che mi serve: Con due comandi installa e compila la versione sperimentale della libreria e crea il pacchetto .deb per la versione 2.32 usando il tool checkinstall.
I comandi, spezzati per maggiore leggibilità ed adattati alla versione 2.33 sono i seguenti:
codice:
mkdir -v $HOME/transmission_build
cd $HME/transmission_build
wget http://monkey.org/~provos/libevent-2.0.11-stable.tar.gz
tar xvf libevent-2.0.11-stable.tar.gz
cd libevent-2.0.11-stable
./configure --prefix=$HOME/transmission_build/libevent
make
sudo make install
La procedura crea la directory transmission_build nella home directory dell'utente corrente, ci scarica dentro la versione 2.0.11-stable dei sorgenti della libreria libevent prelevati dal sito monkey.org:/, scompatta l'archivio e configura, compila ed installa la libreria. Di questa sequenza, l'unico comando che richiede i permessi di superuser è l'installazione, tutto il resto è raccomandabile farlo con i permessi di un utente standard.
Ora non resta che compilare ed installare la versione aggiornata di transmission-daemon.
Per la verità, la procedura sopra indicata sulla vm di test è andata liscia e senza intoppi mentre sul server fisico mi ha dato diversi problemi, probabilmente a causa della presenza della versione precedente della libreria. Sul server fisico ho dovuto rimuovere la versione 1.4 con il comando
codice:
apt-get purge libevent-1.*
prima della procedura precedente e creare un link simbolico alla nuova versione dopo l'installazione, con il comando:
codice:
ln -s /usr/local/lib/libevent-2.0.so.5 /usr/lib/libevent-2.0.so.5
Per installare la versione aggiornata di transmission-daemon è sufficiente eseguire il secondo comando della guida linkata in precedenza, di seguito spezzato per leggibilità ed aggiornato per la versione 2.33:
codice:
cd $HOME/transmission_build
wget http://download.transmissionbt.com/files/transmission-2.33.tar.bz2
tar xjvf transmission-2.33.tar.bz2
cd transmission-2.33
export PKG_CONFIG_PATH="$HOME/transmission_build/libevent/lib/pkgconfig"
./configure
make
sudo checkinstall --pakdir "$HOME/transmission_build" --backup=no --deldoc=yes --fstrans=no --deldesc=yes --delspec=yes --default --pkgversion "2.33"
make clean
In realtà, dovendo installare il programma sulla macchina stessa e non dovendo esportare il pacchetto .deb, gli ultimi due comandi possono essere tranquillamente sostituiti con:
codice:
sudo make install
ma non ci avevo pensato subito...
Installo ora il pacchetto .deb e lancio il comando "transmission-daemon --help" per verificare che la versione sia quella corretta:
codice:
sudo dpkg -i transmission_2.33-1_amd64.deb
(Reading database ... 65418 files and directories currently installed.)
Preparing to replace transmission 2.33-1 (using transmission_2.33-1_amd64.deb) ...
Unpacking replacement transmission ...
Setting up transmission (2.33-1) ...
Processing triggers for man-db ...
matteo@server:~/transmission_build$ transmission-daemon --help
Transmission 2.33 (12565) http://www.transmissionbt.com/
A fast and easy BitTorrent client
Ora che il programma è installato, si tratta di creare un utente limitato "transmission" che esegua il processo transmission-daemon all'avvio ma che sia sprovvisto di password (in modo che non possa fare login sulla macchina) e creare uno script che avvii il daemon con le giuste credenziali al boot del server.
codice:
sudo adduser --disabled-password transmission
Ora eseguo un "cambio d'identità" necessario per avviare il processo transmission-daemon e generare una configurazione iniziale che posso poi personalizzare:
codice:
sudo su transmission
transmission-daemon -f
Se non ci sono messaggi di errore, basta avviare il processo per pochi secondi e poi arrestarlo con il comando "Ctrl +C". Con "exit" riprendo poi la mia identità.
Devo ora creare quello che si chiama "init script" e cioè lo script caricato al boot del server che avvia il processo transmission-daemon e ne permette la classica gestione start | stop | restart. Sono fortunato e la guida riportata qui indica proprio lo script da utilizzare per le distribuzioni debian-like. Non avendo cambiato la configurazione di transmission ed avendo accettato il nome utente "transmission" non devo modificare nulla quindi copio-incollo lo script aprendo con nano come root il file "/etc/init.d/transmission-daemon" e poi lo rendo eseguibile con i comandi:
codice:
sudo chmod +x /etc/init.d/transmission-daemon
sudo chown root:root /etc/init.d/transmission-daemon
Provo:
codice:
# /etc/init.d/transmission-daemon start
Starting bittorrent client transmission-daemon...
Starting bittorrent client transmission-daemon succeeded
root@server:/home/matteo/transmission_build# /etc/init.d/transmission-daemon stop
Stopping bittorrent client transmission-daemon...
start-stop-daemon: warning: this system is not able to track process names
longer than 15 characters, please use --exec instead of --name.
Ed il processo rimane appeso... Ahi! Lo script proposto dalla guida non funziona ma questa mia modifica un pò a sentimento alla linea 103 sembra risolvere il problema:
codice:
start-stop-daemon --chuid $USERNAME --stop --quiet --retry=TERM/10/KILL/5 --pidfile $PIDFILE --exec $DAEMON
I comandi
codice:
/etc/init.d/transmission-daemon start
/etc/init.d/transmission-daemon stop
/etc/init.d/transmission-daemon restart
funzionano ora come previsto. Il mio init-script corretto, testato e funzionate diventa quindi:
codice:
#! /bin/sh
### BEGIN INIT INFO
# Provides: transmission-daemon
# Required-Start: networking
# Required-Stop: networking
# Default-Start: 2 3 5
# Default-Stop: 0 1 6
# Short-Description: Start the transmission BitTorrent daemon client.
### END INIT INFO
# Original Author: Lennart A. JÃŒtte, based on Rob Howell's script
# Modified by Maarten Van Coile & others (on IRC)
# Do NOT "set -e"
#
# ----- CONFIGURATION -----
#
# For the default location Transmission uses, visit:
# http://trac.transmissionbt.com/wiki/ConfigFiles
# For a guide on how set the preferences, visit:
# http://trac.transmissionbt.com/wiki/EditConfigFiles
# For the available environement variables, visit:
# http://trac.transmissionbt.com/wiki/EnvironmentVariables
#
# The name of the user that should run Transmission.
# It's RECOMENDED to run Transmission in it's own user,
# by default, this is set to 'transmission'.
# For the sake of security you shouldn't set a password
# on this user
USERNAME=transmission
# ----- *ADVANCED* CONFIGURATION -----
# Only change these options if you know what you are doing!
#
# The folder where Transmission stores the config & web files.
# ONLY change this you have it at a non-default location
#TRANSMISSION_HOME="/var/config/transmission-daemon"
#TRANSMISSION_WEB_HOME="/usr/share/transmission/web"
#
# The arguments passed on to transmission-daemon.
# ONLY change this you need to, otherwise use the
# settings file as per above.
#TRANSMISSION_ARGS=""
# ----- END OF CONFIGURATION -----
#
# PATH should only include /usr/* if it runs after the mountnfs.sh script.
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
DESC="bittorrent client"
NAME=transmission-daemon
DAEMON=$(which $NAME)
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME
# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0
# Read configuration variable file if it is present
[ -r /etc/default/$NAME ] && . /etc/default/$NAME
# Load the VERBOSE setting and other rcS variables
[ -f /etc/default/rcS ] && . /etc/default/rcS
#
# Function that starts the daemon/service
#
do_start()
{
# Export the configuration/web directory, if set
if [ -n "$TRANSMISSION_HOME" ]; then
export TRANSMISSION_HOME
fi
if [ -n "$TRANSMISSION_WEB_HOME" ]; then
export TRANSMISSION_WEB_HOME
fi
# Return
# 0 if daemon has been started
# 1 if daemon was already running
# 2 if daemon could not be started
start-stop-daemon --chuid $USERNAME --start --pidfile $PIDFILE --make-pidfile \
--exec $DAEMON --background --test -- -f $TRANSMISSION_ARGS > /dev/null \
|| return 1
start-stop-daemon --chuid $USERNAME --start --pidfile $PIDFILE --make-pidfile \
--exec $DAEMON --background -- -f $TRANSMISSION_ARGS \
|| return 2
}
#
# Function that stops the daemon/service
#
do_stop()
{
# Return
# 0 if daemon has been stopped
# 1 if daemon was already stopped
# 2 if daemon could not be stopped
# other if a failure occurred
start-stop-daemon --chuid $USERNAME --stop --quiet --retry=TERM/10/KILL/5 --pidfile $PIDFILE --exec $DAEMON
# start-stop-daemon --stop --quiet --retry=TERM/10/KILL/5 --pidfile $PIDFILE --name $NAME
RETVAL="$?"
[ "$RETVAL" = 2 ] && return 2
# Wait for children to finish too if this is a daemon that forks
# and if the daemon is only ever run from this initscript.
# If the above conditions are not satisfied then add some other code
# that waits for the process to drop all resources that could be
# needed by services started subsequently. A last resort is to
# sleep for some time.
start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
[ "$?" = 2 ] && return 2
# Many daemons don't delete their pidfiles when they exit.
rm -f $PIDFILE
return "$RETVAL"
}
case "$1" in
start)
echo "Starting $DESC" "$NAME..."
do_start
case "$?" in
0|1) echo " Starting $DESC $NAME succeeded" ;;
*) echo " Starting $DESC $NAME failed" ;;
esac
;;
stop)
echo "Stopping $DESC $NAME..."
do_stop
case "$?" in
0|1) echo " Stopping $DESC $NAME succeeded" ;;
*) echo " Stopping $DESC $NAME failed" ;;
esac
;;
restart|force-reload)
#
# If the "reload" option is implemented then remove the
# 'force-reload' alias
#
echo "Restarting $DESC $NAME..."
do_stop
case "$?" in
0|1)
do_start
case "$?" in
0|1) echo " Restarting $DESC $NAME succeeded" ;;
*) echo " Restarting $DESC $NAME failed: couldn't start $NAME" ;;
esac
;;
*)
echo " Restarting $DESC $NAME failed: couldn't stop $NAME" ;;
esac
;;
*)
echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload}" >&2
exit 3
;;
esac
Ora che il software è installato ed il sistema configurato per avviarlo al boot, è necessario configurare anche transmission. Il daemon viene eseguito dall'utente "transmission" quindi la configurazione da modificare si trova nella home directory di questo utente e precisamente nel percorso:
codice:
/home/transmission/.config/transmission-daemon
E' necessario ricordarsi di fermare il daemon con il comando
codice:
/etc/init.d/transmission-daemon stop
prima di modificare la configurazione altrimenti il programma, chiudendosi, sovrascrive il file di configurazione con le impostazioni correnti, eliminando eventuali modifiche fatte dopo l'ultimo avvio.
Questo è il file di configurazione di default.
codice:
{
"alt-speed-down": 50,
"alt-speed-enabled": false,
"alt-speed-time-begin": 540,
"alt-speed-time-day": 127,
"alt-speed-time-enabled": false,
"alt-speed-time-end": 1020,
"alt-speed-up": 50,
"bind-address-ipv4": "0.0.0.0",
"bind-address-ipv6": "::",
"blocklist-enabled": false,
"blocklist-url": "http://www.example.com/blocklist",
"cache-size-mb": 4,
"dht-enabled": true,
"download-dir": "/home/transmission/Downloads",
"encryption": 1,
"idle-seeding-limit": 30,
"idle-seeding-limit-enabled": false,
"incomplete-dir": "/home/transmission/Downloads",
"incomplete-dir-enabled": false,
"lpd-enabled": false,
"message-level": 2,
"peer-congestion-algorithm": "",
"peer-limit-global": 240,
"peer-limit-per-torrent": 60,
"peer-port": 51413,
"peer-port-random-high": 65535,
"peer-port-random-low": 49152,
"peer-port-random-on-start": false,
"peer-socket-tos": "default",
"pex-enabled": true,
"port-forwarding-enabled": true,
"preallocation": 1,
"prefetch-enabled": 1,
"ratio-limit": 2,
"ratio-limit-enabled": false,
"rename-partial-files": true,
"rpc-authentication-required": false,
"rpc-bind-address": "0.0.0.0",
"rpc-enabled": true,
"rpc-password": "{112c502b40dc4eb6ef8c5771f18666f2c30cb19e5abEdhD.",
"rpc-port": 9091,
"rpc-url": "/transmission/",
"rpc-username": "",
"rpc-whitelist": "127.0.0.1",
"rpc-whitelist-enabled": true,
"script-torrent-done-enabled": false,
"script-torrent-done-filename": "",
"speed-limit-down": 100,
"speed-limit-down-enabled": false,
"speed-limit-up": 100,
"speed-limit-up-enabled": false,
"start-added-torrents": true,
"trash-original-torrent-files": false,
"umask": 18,
"upload-slots-per-torrent": 14,
"utp-enabled": true
}
La spiegazione delle varie voci si trova in questa pagina della documentazione online. La parte per me più interessante, è la configurazione dell'interfaccia web (che mi servirà anche per configurare l'interfaccia remota).
codice:
"rpc-authentication-required": false,
"rpc-bind-address": "0.0.0.0",
"rpc-enabled": true,
"rpc-password": "{112c502b40dc4eb6ef8c5771f18666f2c30cb19e5abEdhD.",
"rpc-port": 9091,
"rpc-url": "/transmission/",
"rpc-username": "",
"rpc-whitelist": "127.0.0.1",
"rpc-whitelist-enabled": true,
E' possibile attivare l'accesso autenticato con username e password all'interfaccia web, decidere su quale porta dovrà andare in ascolto l'interfaccia web, eventuali whitelist o range di IP autorizzati, sempre per evitare o consentire accessi non autorizzati dall'esterno. Sempre da questo file di configurazione, è possibile decidere quale porta utilizzare per bittorrent, che dovrà poi essere aperta sul firewall.
Io ho usato il client installato sul mio desktop per creare una configurazione che potesse andare bene anche per il daemon sul server e ho copiato il file di configurazione dal mio desktop al server. Nella documentazione non c'è scritto che algoritmo è utilizzato per cifrare la password, quindi il fatto di averla inserita in chiaro dall'interfaccia grafica è sicuramente un comodità... Credo comunque che sia un md5.
Infine, l'impostazione del parametro "umask" a "0" fà in modo che il trasmission salvi i file scaricati assegnando come permessi di default "666" e quindi concedendo a tutti gli utenti i permessi di lettura e scrittura sui files scaricati. L'interpretazione di questi valori non è molto intuitiva: Il file di configurazione utilizza il "json markup language" e questo formato prevede ed accetta solo numeri in base decimale: "18" è la conversione in base decimale del valore "022" ottale che corrisponde ai permessi di "-rw-r--r--". "0" è la conversione decimale del valore ottale "000" che applicato come mascheramento restituisce, appunto, "666" Per stabilire quindi il valore del parametro bisogna determinale in forma ottale i permessi che si vuole che i file possiedano, determinare il valore ottale della umask da applicare (usando 0666 come valore di partenza, similmente a quanto descritto qui per vsftpd) e convertire questo valore in un numero in base decimale, usando magari una calcolatrice scientifica...
Questo è il file di configurazione che utilizzo sul mio server:
codice:
{
"alt-speed-down": 50,
"alt-speed-enabled": false,
"alt-speed-time-begin": 540,
"alt-speed-time-day": 127,
"alt-speed-time-enabled": false,
"alt-speed-time-end": 1020,
"alt-speed-up": 50,
"bind-address-ipv4": "0.0.0.0",
"bind-address-ipv6": "::",
"blocklist-enabled": false,
"blocklist-updates-enabled": true,
"blocklist-url": "http://www.example.com/blocklist",
"cache-size-mb": 2,
"compact-view": false,
"dht-enabled": true,
"download-dir": "/download/transmission",
"encryption": 1,
"idle-seeding-limit": 30,
"idle-seeding-limit-enabled": false,
"incomplete-dir": "/download/transmission/incompleti",
"incomplete-dir-enabled": true,
"inhibit-desktop-hibernation": false,
"lazy-bitfield-enabled": true,
"lpd-enabled": false,
"main-window-height": 534,
"main-window-is-maximized": 0,
"main-window-width": 674,
"main-window-x": 1157,
"main-window-y": 425,
"message-level": 2,
"open-dialog-dir": "/download/transmission",
"open-file-limit": 32,
"peer-congestion-algorithm": "",
"peer-limit-global": 240,
"peer-limit-per-torrent": 60,
"peer-port": 51413,
"peer-port-random-high": 65535,
"peer-port-random-low": 49152,
"peer-port-random-on-start": false,
"peer-socket-tos": "default",
"pex-enabled": true,
"play-download-complete-sound": false,
"port-forwarding-enabled": true,
"preallocation": 1,
"prefetch-enabled": 1,
"prompt-before-exit": true,
"proxy": "",
"proxy-auth-enabled": false,
"proxy-auth-password": "",
"proxy-auth-username": "",
"proxy-enabled": false,
"proxy-port": 80,
"proxy-type": 0,
"ratio-limit": 2,
"ratio-limit-enabled": false,
"rename-partial-files": true,
"rpc-authentication-required": true,
"rpc-bind-address": "0.0.0.0",
"rpc-enabled": true,
"rpc-password": "hash-della-password",
"rpc-port": 9091,
"rpc-url": "/transmission/",
"rpc-username": "matteo",
"rpc-whitelist": "127.0.0.1,192.168.150.*",
"rpc-whitelist-enabled": true,
"script-torrent-done-enabled": false,
"script-torrent-done-filename": "/home/matteo",
"show-backup-trackers": false,
"show-desktop-notification": false,
"show-extra-peer-details": false,
"show-filterbar": true,
"show-notification-area-icon": false,
"show-options-window": false,
"show-statusbar": true,
"show-toolbar": true,
"show-tracker-scrapes": true,
"sort-mode": "sort-by-name",
"sort-reversed": false,
"speed-limit-down": 100,
"speed-limit-down-enabled": false,
"speed-limit-up": 10,
"speed-limit-up-enabled": true,
"start-added-torrents": true,
"statusbar-stats": "total-ratio",
"trash-original-torrent-files": false,
"umask": 0,
"upload-slots-per-torrent": 14,
"user-has-given-informed-consent": true,
"utp-enabled": true,
"watch-dir": "/download/transmission/pickup",
"watch-dir-enabled": true
}
Infine, devo poi ricordarmi di aprire nella catena INPUT di netfilter la porta configurata in transmission-daemon aggiungendo, allo script che configura il firewall al boot, la regola:
codice:
# Regola che apre la porta in uso da transmission-daemon
$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 51413 -j ACCEPT
Per impostare il sistema per avviare automaticamente transmission-daemon al boot, devo usare il comando:
codice:
update-rc.d transmission-daemon defaults
codice:
root@server:/home/matteo# update-rc.d transmission-daemon defaults
update-rc.d: using dependency based boot sequencing
update-rc.d: warning: transmission-daemon start runlevel arguments (2 3 4 5) do not match LSB Default-Start values (2 3 5)
L'output ci avvisa che il nostro script prevede di avviare il daemon anche al runlevel 4 invece che ai soli runlevel 2, 3 e 5 previsti dalla Linux Standard Base... Poco male, lo lascio così ma se volessi fare il pignolo potrei specificare a mano i runlevel da utilizzare per avvio ed arresto del daemon con il comando:
codice:
update-rc.d transmission-daemon start 20 2 3 5 . stop 80 0 1 6 .
in cui "20" e "80" sono valori che indicano semplicemente una la priorità standard e i valori "2, 3, 5" i runlevel di avvio e 0, 1 e 6 i runlevel di arresto.
Ora posso avviare il mio daemon riavviando il server, per essere sicuro che si riavvii al boot oppure usando il comando:
codice:
sudo /etc/init.d/transmission-daemon start
Nota:
Nel mio caso, uso la directory "\download" e alcune sue sottodirectory nella configurazione di transmission-daemon. Perchè il tutto funzioni è necessario, ovviamente, che l'utente "transmission" abbia i permessi di lettura e scrittura su quelle directory. Il daemon non crea ne modifica le directory in automatico quindi è necessario che tali directory esistano e siano configurate con i permessi corretti.
Nel mio caso, essendo la directory /download di proprietà di root, ho usato il comando
codice:
sudo chmod -R o=rwx /download
per far si la directory /download e tutte le sue sottodirectory fossero scrivibili da tutti gli utenti non appartenenti al gruppo di root, quindi anche dall'utente transmission. E' lo stesso comando usato per rendere la share accessibile tramite samba, quindi nel caso non è necessario ripeterlo.