Инсталлируем набор утилит реализующих функционал создания, управления и раздачей "торрент"-контента.
# aptitude install bittorrent screen
Насколько я понял, утилиты набора bittorrent - на самом деле обёртки скриптов Python для соответствующих библиотек, так что потребуется наличие этого интерпретатора в системе.
"Трекер" как таковой представляет из себя специфичную реализацию HTTP сервера, откликающегося на команды GET. В пакете "bittorrent" уже имеется утилита "bttrack" (она же: "bttrack.bittorrent") реализующая подобный функционал. На самом деле нам от "трекера" не нужно ничего, кроме как обеспечения обмена данными между подключившимися к нему клиентами. Не нужно ни единой базы, ни учёта трафика. Достаточно, чтобы сервер принимал от подключившихся клиентов информацию о имеющихся у них данных и отдавал её другим клиентам по требованию. Эта информация непрерывно обновляется и хранится в оперативной памяти во время работы "трекера", после его остановки она становится абсолютно бесполезной и хранению не подлежит в принципе.
Создавать "торрент"-файлы будем с помощью утилиты "btmakemetafile", которая на самом деле имеет полное имя "btmakemetafile.bitttorrent":
# btmakemetafile "/var/lib/share/files/file.name" http://torrent.storage.local:6969/announce --target "/var/lib/share/torrents/file.name.torrent"
URL в опциях не используется утилитой для публикации "торрент"-файла, а просто указывает на ресурс, где будет работать сам "трекер", связующее звено.
Попробовать опубликовать, сделать доступными какой-нибудь из файлов можно с помощью утилиты "btdownloadheadless", которая на самом деле имеет полное имя "btdownloadheadless.bitttorrent":
# btdownloadheadless --saveas "/var/lib/share/files/file.name" --check_hashes 0 "/var/lib/share/torrents/file.name.torrent"
Но я в публикации "торрент"-ресурсов средствами утилит пакета "bitttorrent" не вижу смысла, так как с этим гораздо лучше справится специализированный "торрент"-клиент - например "rtorrent". Позже мы его настроим.
Пишем скрипт, генерирующий "торрент"-файлы и публикующий файлы ресурсов:
# mkdir -p /usr/local/etc/torrent
# touch /usr/local/etc/torrent/make-torrents.sh
# chmod ugo+x /usr/local/etc/torrent/make-torrents.sh
# touch /usr/local/etc/torrent/make-torrents.sh
# chmod ugo+x /usr/local/etc/torrent/make-torrents.sh
#!/bin/bash
DATE=`date +"%Y-%m-%d %H:%M:%S"`
FILES="/var/lib/share/files"
TORRENTS="/var/lib/share/torrents"
# Временно снимаем с раздачи все ресурсы
/etc/init.d/rtorrent stop
# Удаляем все "торрент"-файлы
rm --recursive --force "${TORRENTS}/*"
# Переходим в директорию хранения файлов
cd "${FILES}"
# Перебираем в цикле все объекты
for OBJECT in *
do
# Отрабатываем только файлы (не директории)
if [ -f "${OBJECT}" ] ; then
# Создаём для файла "торрент"-файл
echo "${DATE}: Make .torrent for ${FILES}/${OBJECT}" >> /var/log/bittorent.make.torrent.log
btmakemetafile "${FILES}/${OBJECT}" http://torrent.storage.local:6969/announce --target "${TORRENTS}/${OBJECT}.torrent" >/dev/null 2>&1
fi
done
# Восстанавливаем раздачи
/etc/init.d/rtorrent start
# После генерации "торрент"-файлов подправляем права доступа для того, чтобы члены группы операторов в дальнейшем могли обратится к ресурсам
chown -R root:share-users "${TORRENTS}"
chmod -R g-w "${TORRENTS}"
chmod -R o-rwx "${TORRENTS}"
exit 0
DATE=`date +"%Y-%m-%d %H:%M:%S"`
FILES="/var/lib/share/files"
TORRENTS="/var/lib/share/torrents"
# Временно снимаем с раздачи все ресурсы
/etc/init.d/rtorrent stop
# Удаляем все "торрент"-файлы
rm --recursive --force "${TORRENTS}/*"
# Переходим в директорию хранения файлов
cd "${FILES}"
# Перебираем в цикле все объекты
for OBJECT in *
do
# Отрабатываем только файлы (не директории)
if [ -f "${OBJECT}" ] ; then
# Создаём для файла "торрент"-файл
echo "${DATE}: Make .torrent for ${FILES}/${OBJECT}" >> /var/log/bittorent.make.torrent.log
btmakemetafile "${FILES}/${OBJECT}" http://torrent.storage.local:6969/announce --target "${TORRENTS}/${OBJECT}.torrent" >/dev/null 2>&1
fi
done
# Восстанавливаем раздачи
/etc/init.d/rtorrent start
# После генерации "торрент"-файлов подправляем права доступа для того, чтобы члены группы операторов в дальнейшем могли обратится к ресурсам
chown -R root:share-users "${TORRENTS}"
chmod -R g-w "${TORRENTS}"
chmod -R o-rwx "${TORRENTS}"
exit 0
Перегенерация контрольных "торрент"-файлов происходит так быстро (1-2 секунды), относительно времени первичного создания (десять-пятьдесят секунд), что я склоняюсь к тому, чтобы вообще не проверять наличие их, а перегенерировать заново при каждом проходе скрипта. Мы не публичный трекер делаем, набор файлов должен быть невелик, да и вдруг они были перезагружены при неизменном имени? Для красоты, конечно, хорошо бы сделать избирательную генерацию "торрент"-файлов, публикацию и снятие с раздачи только необходимых файлов, но это дело "шлифования" раскрученного сервиса, чуть позже можно будет этим заняться.
Периодический запуск скрипта обеспечим с помощью утилиты cron (каждые три часа):
# cat /etc/crontab
....
1 */3 * * * root /usr/local/etc/torrent/make-torrents.sh &
....
1 */3 * * * root /usr/local/etc/torrent/make-torrents.sh &
....
Итак, "торрент"-файлы сгенерированны, остается запустить "трекер" для обслуживания подключившихся клиентов в работу - например так:
# bttrack --port 6969 --dfile "/var/log/bittorent.download.log" --allowed_dir "/var/lib/share/torrents" --show_names "1" --reannounce_interval "600" --parse_allowed_interval "5" & >> /var/log/bittorent.events.log
Где:
"--port" - прослушиваемый "трекером" порт;
"--dfile" - путь к файлу журналирования операций трекера;
"--allowed_dir" - указываем "трекеру" оперировать только с "торрент"-файлами, расположенными в определённой директории;
"--show_names" - разрешаем показывать в публичном доступе расширенную статистику о состоянии "трекера" (очень познавательно);
"--reannounce_interval" - время в секундах между пере объявлениями о статусе раздач;
"--parse_allowed_interval" - время в минутах между сканированием директории "торрент"-файлов на предмет изменений.
"--dfile" - путь к файлу журналирования операций трекера;
"--allowed_dir" - указываем "трекеру" оперировать только с "торрент"-файлами, расположенными в определённой директории;
"--show_names" - разрешаем показывать в публичном доступе расширенную статистику о состоянии "трекера" (очень познавательно);
"--reannounce_interval" - время в секундах между пере объявлениями о статусе раздач;
"--parse_allowed_interval" - время в минутах между сканированием директории "торрент"-файлов на предмет изменений.
Посмотрим, слушает ли "трекер" указанный ему порт:
# netstat -apn | grep python
tcp 0 0 0.0.0.0:6969 0.0.0.0:* LISTEN 16692/python
Обратимся к "трекеру" за сведениями о его состоянии, направив браузер по адресу "http://torrent.storage.local:6969/":
BitTorrent download info
info hash torrent name size complete downloading downloaded transferred
....
1bd1fd80e7feab4ba7e4a82f78999d47bb9ee587 ChromeSetup.exe 474KiB 5 0 5 2MiB
....
2971501b4a2296f6d3677954f4bd110f6a48a7b7 Firefox Setup 3.6.2.exe 8MiB 5 0 5 41MiB
....
f316cb6ac9eb3eca52c39f80f0712c8c5c0d9d03 Inkscape-0.46.win32.exe 33MiB 4 0 5 167MiB
....
41 files 1.14GiB 4/172 0/0 185/195 5.32GiB
....
info hash torrent name size complete downloading downloaded transferred
....
1bd1fd80e7feab4ba7e4a82f78999d47bb9ee587 ChromeSetup.exe 474KiB 5 0 5 2MiB
....
2971501b4a2296f6d3677954f4bd110f6a48a7b7 Firefox Setup 3.6.2.exe 8MiB 5 0 5 41MiB
....
f316cb6ac9eb3eca52c39f80f0712c8c5c0d9d03 Inkscape-0.46.win32.exe 33MiB 4 0 5 167MiB
....
41 files 1.14GiB 4/172 0/0 185/195 5.32GiB
....
Для автоматизации запуска "трекера" напишем примитивный скрипт:
# vi /etc/init.d/bttrack && chmod ugo+x /etc/init.d/bttrack
### BEGIN INIT INFO
# Provides: bttrack
# Required-Start: $local_fs $network
# Required-Stop: $local_fs $network
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Script management of bttrack
# Description: Script management of bttrack
### END INIT INFO
TORRENTS="/var/lib/share/torrents"
LOG="/var/log/bittorent.download.log"
case "$1" in
start)
bttrack --port 6969 --dfile "${LOG}" --allowed_dir "${TORRENTS}" --show_names "1" --reannounce_interval "600" --parse_allowed_interval "5" >/dev/null 2>&1 &
;;
stop)
killall bttrack
;;
restart|force-reload)
$0 stop
echo "Wait 5 seconds..."
sleep 5
$0 start
;;
*)
echo "Usage: /etc/init.d/bttrack {start|stop|restart}"
exit 1
;;
esac
exit 0
# Provides: bttrack
# Required-Start: $local_fs $network
# Required-Stop: $local_fs $network
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Script management of bttrack
# Description: Script management of bttrack
### END INIT INFO
TORRENTS="/var/lib/share/torrents"
LOG="/var/log/bittorent.download.log"
case "$1" in
start)
bttrack --port 6969 --dfile "${LOG}" --allowed_dir "${TORRENTS}" --show_names "1" --reannounce_interval "600" --parse_allowed_interval "5" >/dev/null 2>&1 &
;;
stop)
killall bttrack
;;
restart|force-reload)
$0 stop
echo "Wait 5 seconds..."
sleep 5
$0 start
;;
*)
echo "Usage: /etc/init.d/bttrack {start|stop|restart}"
exit 1
;;
esac
exit 0
Анонсируем наш скрипт для нужных уровней запуска при загрузке системы:
# update-rc.d bttrack start 10 2 3 4 5 . stop 10 0 1 6 .
Как видно, схема публикации проста и незатейлива.