UMGUM.COM (лучше) 

BitTorrent ( Пакет BitTorrent как средство организации распространения файлов. )

2 сентября 2010  (обновлено 31 января 2015)

OS: Linux Debian Lenny/Squeeze/Wheezy.

Инсталлируем набор утилит реализующих функционал создания, управления и раздачей "торрент"-контента.

# 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

#!/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

Перегенерация контрольных "торрент"-файлов происходит так быстро (1-2 секунды), относительно времени первичного создания (десять-пятьдесят секунд), что я склоняюсь к тому, чтобы вообще не проверять наличие их, а перегенерировать заново при каждом проходе скрипта. Мы не публичный трекер делаем, набор файлов должен быть невелик, да и вдруг они были перезагружены при неизменном имени? Для красоты, конечно, хорошо бы сделать избирательную генерацию "торрент"-файлов, публикацию и снятие с раздачи только необходимых файлов, но это дело "шлифования" раскрученного сервиса, чуть позже можно будет этим заняться.

Периодический запуск скрипта обеспечим с помощью утилиты cron (каждые три часа):

# cat /etc/crontab

....
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" - время в минутах между сканированием директории "торрент"-файлов на предмет изменений.

Посмотрим, слушает ли "трекер" указанный ему порт:

# 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
....

Для автоматизации запуска "трекера" напишем примитивный скрипт:

# 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

Анонсируем наш скрипт для нужных уровней запуска при загрузке системы:

# update-rc.d bttrack start 10 2 3 4 5 . stop 10 0 1 6 .

Как видно, схема публикации проста и незатейлива.


Заметки и комментарии к публикации:


Оставьте свой комментарий ( выразите мнение относительно публикации, поделитесь дополнительными сведениями или укажите на ошибку )