субота, 18 серпня 2007 р.

rbtorstat - простий ґенератор веб-сторінки rTorrent

rbtorstat (r - ruby, rb - ruby, b - bit, btor - bittorrent, tor - torrent, stat - status) - простий ґенератор веб-сторінки, написаний (мною) на мові програмування Ruby, який показує інформацію статусу про rTorrent - консольний bittorrent клієнт для Unix/Linux систем. Це дає змогу швидко переглядати список torrent-ів і їх статус у веб-браузері, без необхідності коннектитись на віддалену машину (наприклад по ssh, далі screen + rTorrent).

Скрипт зчитує збережені дані про сесію rtorrent, створює звіт про статус torrent файлів і виводить код HTML на stdout, який далі можна перенаправити у файл і зробити його публічно доступним на веб-сервер. rbtorstat не підтримую віддалене адміністрування rTorrent. Але завдяки тому що у версії 0.7.5 була додана можливість віддаленого адміністрування використовуючи засоби xmlrpc (докладніше про це можна почитати тут) це не складе особливих труднощів. rbtorstat, як видно із заголовку переслідує зовсім інші цілі.

Початковий код rbtorstat базується на основі rtorstat, написаному Джорджом Нотарасом(
George Notaras) на мові програмування Python.

Залежності:
  • Ruby;
  • bencode - бібліотека Ruby для перетворення даних Bencode (що використовується в протоколі BitTorrent) у послідовну форму;
  • rTorrent - консольний BitTorrent-клієнт для Linux, написаний на мові програмування C++, сконфігурований для зберігання даних про сесії (про це докладніше далі);
Конфігурація rTorrent:
rbtorstat повинен зчитувати дані
сесії torrent, тому rTorrent потрібно налаштувати, так щоб зберігати цю інформацію у певну директорію. Далі наведений конфігураційний файл (.rtorrent.rc) :
port_range=6900-6999
download_rate = 64
upload_rate = 16
session = /opt/rtorrent
# Keeps session data files even if torrent has finished
session_on_completion = yes
session_lock = yes
# Save session data every 5 mins, with a 4 min offset
schedule = session_save,240,300,session_save=

Остання директива (
schedule) вказує rTorrent щоб зберігати дані сесії кожні 5 хвилин з відгалуженням 4 хвилини. Це означає, що дані сесії будуть збережені, наприклад, о 00:04, 00:09, і т.д.

Використання:

Для виконання скрипта достатньо вказати у вихідному файлі коректний шлях до директорії із даними сесії rTorrent. На виході буде отриманий код HTML, який можна перенаправити у файл, наприклад так:
$ ruby rbtorstat.rb > /var/www/index.txt

Крім того його можна прописати до cron:
*/5 * * * * root ruby /path/to/rbtorstat.rb /opt/rtorrent/ > /var/www/index.html

Скрипт буде запускатись кожні 5 хвилин.
Результат можна переглянути на веб-сервері.
Завантажити:
Наразі чорновий варіант скрипта можна завантажити за адресою:
http://anton.linux.googlepages.com/rbtorstat.rb

Реальний приклад:
http://info.opoz.homeip.net/rbtorstat.html

Плани на майбутнє:
Скрипт написаний виключно у приватних цілях і підтримуватись у майбутньому не буде.

Програмування:
Для того щоб обробляти torrent-файли або файли сесії rTorrent (які є тими ж *.torrent) у Ruby потрібно проінсталювати бібліотеку bencode:
$ gem install bencode

Приклад скрипта для завантаження torrent-файлу у хеш(Hash):
require 'rubygems'
require 'bencode'
t_dict = BEncode.load_file(torrent)

Дізнатись докладніше про специфікація протоколу Bittorrent тут .
Наприклад:
t_dict['info']['name'] # назва файлу
t_dict['info']['length'] # довжина файлу у байтах

Крім того rTorrent має декілька специфічних директив:
t_dict['rtorrent']['total_uploaded'] # кількість вивантажених байт
t_dict['rtorrent']['complete'] # статус закачки (завантажився чи ні?)
Просто і плоско до бєзобразія :). Успіхів.

4 коментарі:

libc6 сказав...

Сила.
Коли в мене був безлiмiтний тирнет, я використовував rtorrent. Менi б така програмулька тодi дуже знадобилась. Буду мати на увазi

_linux_ сказав...

Більше того починаючи з версії 0.7.5, rtorrent має вбудований XMLRPC інтерфейс. Якось тре набратись мужності :) і дописати адміністративні функції (додавання нових торрентів ,керування швидкістю і закачками) через веб-інтерфейс. Хоча і ssh + screen не сильно напрягає :)

libc6 сказав...

Зовсiм не сильно :)

libc6 сказав...

Хоча написати самому значно приємниiше