AntiSlaed CMS
Вход
Логин: Пароль:Забыли пароль?
Запомнить вас на этом компьютере?
Войти скрытым?

Здравствуйте, Гость ( Вход | Регистрация )

> Внимание!

Адрес нашего форума изменился, теперь мы доступны по адресу antislaed.net. Обновите ссылки и закладки, он больше не изменится.


> Делаем по быстрому битторрент-трекер на основе XBT и IPB
Z1dan3
сообщение Mar 6 2009, 20:02
Сообщение #1


x_X
Иконка группы

Группа: Дизайнеры

Сообщений: 633
Регистрация:
12.4.2008
Из: :( Украина :(
Пользователь №: 3,219
Спасибо сказали: 229

Вставить ник




Для начала надо поднять backend трекера - т.е. именно серверную часть.
Выбран был в этом качестве XBT - http://xbtt.sourceforge.net/
Процедура инсталяции там описана, скажу лишь что поскольку у меня была Slackware - мне пришлось скачать библиотеку libboost вручную.
libboost можно найти здесь - http://www.boost.org/

Скачал, стандартно комбинация из трех волшебных команд configure, make, make install - ничего необычного
Затем по инструкции с http://xbtt.sourceforge.net/tracker/ забрал и собрал XBT Tracker:

svn co https://xbtt.svn.sourceforge.net/svnroot/xbtt/trunk/xbt/misc xbt/misc
svn co https://xbtt.svn.sourceforge.net/svnroot/xb...unk/xbt/Tracker xbt/Tracker
cd xbt/Tracker
./make.sh

Тут тоже ничего необычного, все собралось, имеем в результате исполняемый файл xbt_tracker

Перед запуском серверной части сначала необходимо еще создать нужные таблицы.
Я немного модифицировал скрипт входящий в комплект - кое-где добавил дополнительные поля, плюс добавил триггеров.
Здесь его можно скачать отдельно, либо сразу со всеми файлами в архиве
Создать таблицы я решил для простоты в той же БД что и сами форумы.

Почему использовал триггеры? От лени - ситуация когда добавляется новый пользователь в форумах - для того,
чтобы он мог работать мне проще показалось решить не ковырянием кода форума - а просто навешиванием простейшего триггера.
Обработать ситуацию удаления торрент-файла - тоже показалось проще через тригеры.

Все, теперь можно и запустить xbt_tracker.
Рисуем ему в конфиге логины и пароли для доступа к нужным ему таблицам (а нужны ему только таблицы xbt_* - поэтому,
можно и даже нужно, создать отдельного mysql пользователя имеющего доступ _только_ к этим таблицам)
конфиг xbt_tracker.conf получился примерно таким

ЦИТАТА
//--------------------------
mysql_host = ip
mysql_user = user
mysql_password = pass
mysql_database = ipb_db
announce_interval = 1800
anonymous_connect = 0
anonymous_announce = 0
anonymous_scrape = 0
auto_register = 0
clean_up_interval = 60
listen_check = 0
listen_ipa = *
listen_port = 2710
log_access = 0
log_announce = 0
log_scrape = 0
pid_file =
read_config_interval = 300
read_db_interval = 60
redirect_url =
scrape_interval = 60
update_files_method = 2
write_db_interval = 60
debug = 0
//--------------------------


Запускаем. Кстати, должен сказать - сам xbt_tracker у меня запущен на совсем другом сервере, отличном от того,
на котором находится инвижновский форум и его БД.

Теперь начинаем поднимать frontend - т.е. править исходники инвижновского форума чтобы можно было работать с трекером (IMG:http://antislaed.net/style_emoticons/default/smile.gif) .
Все нижесказанное для форумов версии 2.2.2, русской версии.

Для начала заходим в админскую часть и прописываем там разрещение для прикрепления файлов с расширением ".torrent"
Закладка "Управление", раздел "Прикрепляемые файлы".

Затем не выходя из админки надо сделать изменения для интерфейса.
Закладка "Внешний вид", в каждом используемом стиле выбираем "изменить HTML-шаблоны".
Находим skin_topic, там находим Show_attachments
В самом конце добавляем код из этого файла (надо скачать его к себе и открыть в любом текстовом редакторе
- при открытии в интернет-эксплорер он покажет пустоту (IMG:http://antislaed.net/style_emoticons/default/wink.gif) )

Аналогично надо найти skin_profile, там найти personal_portal_main и добавить код из этого файла
Код лучше всего мне кажется добавить надо после раздела <!-- / Custom Fields --> и перед разделом <!-- Statistics -->

Все, в админке закончили, теперь надо править сам код инвижна
Если вы скачаете архив со всеми файлами есть очень большая вероятность того что вам подойдут патчи,
и все будет очень просто - надо будет просто их применить к двум файлам: class_attach.php из каталога sources/classes/attach и
profile.php из каталога sources/action_public

Если нет - то пытаемся ручками все сделать (IMG:http://antislaed.net/style_emoticons/default/smile.gif)
Для начала необходимо скопировать библиотеку benc.php для работы с торрент-файлами в каталог /sources форума.
Взять ее можно из этого архива, либо здесь

В каталоге sources/classes/attach находим файл class_attach.php
Находим функцию show_attachment (примерно 209 строка)
Находим блок кода (пр. 298 строка)

ЦИТАТА
//-----------------------------------------
// Open and display the file..
//-----------------------------------------

//$contents = file_get_contents( $file );

header( "Content-Type: ".$this->ipsclass->cache['attachtypes'][ $attach['attach_ext'] ]['atype_mimetype'] );
header( "Content-Disposition: inline; filename=\"".$attach['attach_file']."\"" );
header( "Content-Length: ".(string)(filesize( $file ) ) );

//print $contents;
readfile( $file );
exit();


Заменяем на свой

ЦИТАТА
//-----------------------------------------
// Open and display the file..
//-----------------------------------------

//$contents = file_get_contents( $file );

if(strcasecmp($attach['attach_ext'], "torrent"))
{
header( "Content-Type: ".$this->ipsclass->cache['attachtypes'][ $attach['attach_ext'] ]['atype_mimetype'] );
header( "Content-Disposition: inline; filename=\"".$attach['attach_file']."\"" );
header( "Content-Length: ".(string)(filesize( $file ) ) );

readfile( $file );
exit();
}
else
{
$ibz_sql = $this->ipsclass->DB->query("SELECT torrent_pass FROM xbt_users WHERE uid ='".addslashes($this->ipsclass->member['id'])."' LIMIT 1");
$this->ipsclass->DB->simple_exec();
$r = $this->ipsclass->DB->fetch_row($ibz_sql);

header( "Content-Type: ".$this->ipsclass->cache['attachtypes'][ $attach['attach_ext']]['atype_mimetype'] );
header( "Content-Disposition: inline; filename=\"".$attach['attach_file']."\"" );

require_once( ROOT_PATH."sources/benc.php" );
$torrent = bdec_file($file, 1 << 20);

// Для отключения DHT
// $torrent["value"]["info"]["value"]["private"]["value"] = 1;

// 172.20.0.4 замените на свой ип-адрес
$torrent["value"]["announce"]["value"] = "http://172.20.0.4:2710/".$r['torrent_pass']."/announce";

header( "Content-Length: ".(string)(strlen( benc($torrent) ) ) );
print benc($torrent);
exit();
}



Находим функцию render_attachments (приимерно 340-я строка оригинального файла)
Находим блок (примерно 520-я строка оригинального файла)

ЦИТАТА
// Full attachment thingy
//-----------------------------------------

$tmp = $this->ipsclass->compiled_templates[ $skin_name ]->Show_attachments( array (
'attach_hits' => $row['attach_hits'],
'mime_image' => $this->ipsclass->cache['attachtypes'][ $row['attach_ext'] ]['atype_img'],
'attach_file' => $row['attach_file'],
'attach_id' => $row['attach_id'],
'type' => $this->type,
'file_size' => $this->ipsclass->size_format( $row['attach_filesize'] ),
) );


И заменяем на свой код

ЦИТАТА
if($row['attach_ext']=="torrent")
{
$ibz_sql = $this->ipsclass->DB->query("SELECT info_hash, leechers, seeders,completed, files_size, files_count FROM xbt_files WHERE attach_id = '".$row['attach_id']."' LIMIT 1");
$this->ipsclass->DB->simple_exec();
$r = $this->ipsclass->DB->fetch_row($ibz_sql);
$tmp = $this->ipsclass->compiled_templates[ $skin_name ]->Show_attachments(array (
'attach_hits' => $row['attach_hits'],
'mime_image' => $this->ipsclass->cache['attachtypes'][ $row['attach_ext'] ]['atype_img'],
'attach_file' => $row['attach_file'],
'attach_id' => $row['attach_id'],
'type' => $this->type,
'file_size' => $this->ipsclass->size_format( $row['attach_filesize'] ),
'is_torrent' => 1,
'seeders' => (int)$r['seeders'],
'leechers' => (int)$r['leechers'],
'completed' => (int)$r['completed'],
'torrent_files_size' => $this->ipsclass->size_format( $r['files_size'] ),
'torrent_files_count' => (int)$r['files_count'],
'info_hash' => bin2hex($r["info_hash"]),
) );
}
else
{
$tmp = $this->ipsclass->compiled_templates[ $skin_name ]->Show_attachments(array (
'attach_hits' => $row['attach_hits'],
'mime_image' => $this->ipsclass->cache['attachtypes'][ $row['attach_ext'] ]['atype_img'],
'attach_file' => $row['attach_file'],
'attach_id' => $row['attach_id'],
'type' => $this->type,
'file_size' => $this->ipsclass->size_format( $row['attach_filesize'] ),
'is_torrent' => 0,
) );
}


Находим функцию process_upload (примерно 766 строка оригинального файла)
В самом ее конце между кодом

ЦИТАТА
$this->ipsclass->DB->do_insert( 'attachments', $attach_data );

$newid = $this->ipsclass->DB->get_insert_id();

И строкой (примерно 961-я строка оригинального файла)

return $newid;



Вставляем свой код

ЦИТАТА
if (!strcasecmp($attach_data['attach_ext'], 'torrent'))
{
require_once( ROOT_PATH."sources/benc.php" );
$torrent = bdec_file($upload->saved_upload_name, 1 << 20);
if (!isset($torrent))
return $attach_data;
$bt_info_hash = pack('H*', sha1($torrent['value']['info']['string']));
$torrent_files_count = count($torrent["value"]["info"]["value"]["files"]["value"]);
if($torrent_files_count == 0)
{
$torrent_files_count = 1;
$bt_size = $torrent["value"]["info"]["value"]["length"]["value"];
}
else
{
$bt_size = 0;
for($torrent_i=0;$torrent_i<$torrent_files_count;$torrent_i++)
{
$bt_size += $torrent["value"]["info"]["value"]["files"]["value"][$torrent_i]["value"]["length"]["value"];
}
}
$this->ipsclass->DB->query("insert into xbt_files (info_hash, ctime, files_size, attach_id,files_count) values ('".addslashes($bt_info_hash)."', Now(), '$bt_size', $newid, $torrent_files_count)");
}



Редактирование class_attach.php завершено
Переходим к редактированию файла sources/action_public/profile.php
Находим функцию personal_portal_view (примерно 2446-я строка)
Находим блок (примерно 3017-я строка)

ЦИТАТА
//-----------------------------------------
// Online location
//-----------------------------------------

$member = $this->personal_portal_get_user_location( $member );^M


Добавляем после него свой код


ЦИТАТА
$ibz_sql = $this->ipsclass->DB->query("SELECT can_leech, wait_time, torrents_limit, downloaded, uploaded FROM xbt_users WHERE uid = '".$member['id']."' LIMIT 1");
$this->ipsclass->DB->simple_exec();
$r = $this->ipsclass->DB->fetch_row($ibz_sql);

if(($r['downloaded'] <> 0)||($r['uploaded']<>0))
{
$member['show_torrent_stats'] = 1;
}
else
{
$member['show_torrent_stats'] = 0;
}
$member['show_torrent_uploaded'] = $this->ipsclass->size_format( $r['uploaded'] );
$member['show_torrent_downloaded'] = $this->ipsclass->size_format( $r['downloaded'] );
if($r['downloaded']==0)
{
$member['show_torrent_ratio'] = 'inf';
}
else
{
$member['show_torrent_ratio'] = number_format($r['uploaded'] / $r['downloaded'], 2);
}
if( $r['can_leech'] != 1 )
{
$member['show_torrent_limit'] = "запрещено скачивать";
}
else
{
if( $r['torrents_limit'] == 0 )
{
$member['show_torrent_limit'] = "разрешено скачивать сколько угодно торентов";
}
else
{
$member['show_torrent_limit'] = "разрешено скачивать ".$r['torrents_limit']." торент(ов|а)";
}
}
if( $r['wait_time'] != 0 )
{
$member['show_torrent_limit'] .= "<br>Пауза для новых торрентов = ".$r['wait_time']." секунд";
}


Все, редактирование завершено

Теперь - создаем торрент-файл (в uTorrent'е я создавал с announce url="http://" и сам ставил флаг приватного торрента).
Прикрепляем его к своему сообщению. Затем заново его скачиваем (при этом в этот торрент-файл уже автоматически заполнится мой хеш,
и урл трекера) - указываем исходный файл, и вуаля. Вот картинки как это примерно выглядит:

(IMG:http://www.ibz.ru/articles/tracker/topic.gif)

(IMG:http://www.ibz.ru/articles/tracker/profile.gif)

Конечно все очень просто - но минимум необходимого для быстрого старта есть. Есть куда и развивать дальше. (IMG:http://antislaed.net/style_emoticons/default/smile.gif)

© IBZ.ru
Z1dan3, Вас 3 раз(а) поблагодарили за это сообщение:
$ecurity, Makc0809, tashrapstroy
Перейти в начало страницы
 
     Выделите текст перед нажатием цитаты
+Цитировать сообщение
 
Начать новую тему
Ответов (1 - 2)
upper
сообщение Sep 9 2009, 15:16
Сообщение #2


Я только смотрю...
Иконка группы

Группа: Пользователи

Сообщений: 1
Регистрация:
9.9.2009
Пользователь №: 9,099
Спасибо сказали: 0

Вставить ник




ЦИТАТА
Находим skin_topic, там находим Show_attachments
В самом конце добавляем код из этого файла (надо скачать его к себе и открыть в любом текстовом редакторе
- при открытии в интернет-эксплорер он покажет пустоту )


Уважаемый, классный мануал, однако что это за файлы, где их взять? Что скачивать?

require_once( ROOT_PATH."sources/benc.php" ); - benc.php отсутствует
bdec_file($upload->saved_upload_name, 1 << 20); - функция bdec_file отсутствует

А что никто не пробовал? (IMG:http://antislaed.net/style_emoticons/default/smile.gif)

Сообщение отредактировал upper: Sep 10 2009, 10:47
Перейти в начало страницы
 
     Выделите текст перед нажатием цитаты
+Цитировать сообщение
Жемчужина789
сообщение Sep 10 2009, 17:46
Сообщение #3


Я только смотрю...
Иконка группы

Группа: Пользователи

Сообщений: 7
Регистрация:
10.9.2009
Пользователь №: 9,108
Спасибо сказали: 1

Вставить ник




XBT - обалденная штука, в плане нагрузки.
Но посоветовал бы TorrentPier ( torrentpier.info ) SVN версии ( ветка 1.0 )
К нему уже есть прикрученный XBT ( как известно, на нем крутиться т.ру )
К плюсам отнес бы распределение нагрузки, мемкэшэд и много вкусностей в виде поддержки и модов.
К минусам данной сборки - сложность модов IPB ( мастером ставить не очень то и удобно - хотя возможно я не понимаю чуть-чуть ) и корявость - на милворм уже есть выложенные 3 дырки к подобным сборкам ( собирали вроде на первой ветке ipb зыкрытой, суть дырки была в недостаточной фильтрации данных из торрент файла когда парсились комменты )
Жемчужина789, Вас 1 раз(а) поблагодарили за это сообщение:
upper
Перейти в начало страницы
 
     Выделите текст перед нажатием цитаты
+Цитировать сообщение

Ответить в данную темуНачать новую тему

2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
 

RSS Текстовая версия Сейчас: 25 November 2024 - 11:35
Хостинг предоставлен NetLevel.Ru   Eleanor CMS