Мы — долго запрягаем, быстро ездим, и сильно тормозим.
www.lissyara.su —> www.lissyara.su —> rtorrent+webui

Качаем и раздаём торренты с rtorrent через очень удобную вебморду от utorrent

Автор: opt1k.


Всё началось с того что мне надоело держать свой десктоп постоянно включеным,
в то время как на полке в коридоре уже работает круглосуточно шлюз. Вот я и
решил перекинуть задачку с торрентами на шлюз и прикрутить удобную веб рулилку
для соседей. Долго рылся в инете пока не определился что для меня подойдёт
rtorrent, потом долго не мог определиться с  веб мордой, остановился на
wtorrent и какое то время им пользовался. Но потом случайно забрёл сюда
и решил что тут более красивое и функциональное решение веб обвязки, поэтому
его и будем прикручивать.

Начинаем как всегда с обновления портов.
Ставим нужные порты:
cd /usr/ports/www/lighttpd

снимаем все галки, нам тут ничего не надо
cd /usr/ports/lang/php5

выбираем только cgi и fastcgi
cd /usr/ports/lang/php5-extensions

отмечаем xml, xmlrpc, pcre, curl
cd /usr/ports/net-p2p/rtorrent

ставим галку только напротив xmlrpc
cd /usr/ports/sysutils/screen

смело снимаем все галки.


Всё, порты поставили, теперь конфиги.
cat /usr/local/etc/lighttpd.conf
server.modules              = (
                               "mod_rewrite",
                               "mod_redirect",
                               "mod_alias",
                               "mod_access",
                               "mod_auth",
                               "mod_fastcgi",
                               "mod_scgi",
                               "mod_accesslog" )
server.document-root        = "/usr/local/www/"
server.errorlog             = "/var/log/lighttpd.error.log"
index-file.names            = ( "index.php", "index.html",
                                "index.htm", "default.htm" )
server.event-handler = "freebsd-kqueue" # needed on OS X
mimetype.assign             = (
  ".pdf"          =>      "application/pdf",
  ".sig"          =>      "application/pgp-signature",
  ".spl"          =>      "application/futuresplash",
  ".class"        =>      "application/octet-stream",
  ".ps"           =>      "application/postscript",
  ".torrent"      =>      "application/x-bittorrent",
  ".dvi"          =>      "application/x-dvi",
  ".gz"           =>      "application/x-gzip",
  ".pac"          =>      "application/x-ns-proxy-autoconfig",
  ".swf"          =>      "application/x-shockwave-flash",
  ".tar.gz"       =>      "application/x-tgz",
  ".tgz"          =>      "application/x-tgz",
  ".tar"          =>      "application/x-tar",
  ".zip"          =>      "application/zip",
  ".mp3"          =>      "audio/mpeg",
  ".m3u"          =>      "audio/x-mpegurl",
  ".wma"          =>      "audio/x-ms-wma",
  ".wax"          =>      "audio/x-ms-wax",
  ".ogg"          =>      "application/ogg",
  ".wav"          =>      "audio/x-wav",
  ".gif"          =>      "image/gif",
  ".jar"          =>      "application/x-java-archive",
  ".jpg"          =>      "image/jpeg",
  ".jpeg"         =>      "image/jpeg",
  ".png"          =>      "image/png",
  ".xbm"          =>      "image/x-xbitmap",
  ".xpm"          =>      "image/x-xpixmap",
  ".xwd"          =>      "image/x-xwindowdump",
  ".css"          =>      "text/css",
  ".html"         =>      "text/html",
  ".htm"          =>      "text/html",
  ".js"           =>      "text/javascript",
  ".asc"          =>      "text/plain",
  ".c"            =>      "text/plain",
  ".cpp"          =>      "text/plain",
  ".log"          =>      "text/plain",
  ".conf"         =>      "text/plain",
  ".text"         =>      "text/plain",
  ".txt"          =>      "text/plain",
  ".dtd"          =>      "text/xml",
  ".xml"          =>      "text/xml",
  ".mpeg"         =>      "video/mpeg",
  ".mpg"          =>      "video/mpeg",
  ".mov"          =>      "video/quicktime",
  ".qt"           =>      "video/quicktime",
  ".avi"          =>      "video/x-msvideo",
  ".asf"          =>      "video/x-ms-asf",
  ".asx"          =>      "video/x-ms-asf",
  ".wmv"          =>      "video/x-ms-wmv",
  ".bz2"          =>      "application/x-bzip",
  ".tbz"          =>      "application/x-bzip-compressed-tar",
  ".tar.bz2"      =>      "application/x-bzip-compressed-tar",
  ""              =>      "application/octet-stream",
 )
accesslog.filename          = "/var/log/lighttpd.access.log"
url.access-deny = ("~", ".inc", ".db", ".tpl.php", ".cls.php",)
$HTTP["url"] =~ "\.pdf$" {
  server.range-requests = "disable"
}
static-file.exclude-extensions = ( ".php", ".pl", ".fcgi" )
server.pid-file            = "/var/run/lighttpd.pid"
server.username            = "www"
server.groupname           = "www"

fastcgi.server             = ( ".php" =>
                               ( "localhost" =>
                                 (
                                   "socket" => "/tmp/fcgi.socket",
#                                   "bin-path" => "/usr/local/bin/php-cgi-cgi"
                                 )
                               )
                            )

scgi.server = (
                "/RPC2" =>
                  ( "127.0.0.1" =>
                    (
                      "socket" => "/tmp/rtorrent_rpc.socket",
                      "check-local" => "disable",
#                      "disable-time" => 0,  # don't disable scgi if connection fails
                    )
                  )
              )


auth.backend = "htdigest"
auth.backend.htdigest.userfile = "/usr/local/www/rtorrent/rtorrent_users"
auth.require = ( "/RPC2" =>
 (
  "method" => "basic",
  "realm" => "XML-RPC",
  "require" => "valid-user"
 )
)

cat /usr/local/etc/rc.d/php_fastcgi
#!/bin/sh
#
# PROVIDE: php_fastcgi
# REQUIRE: DAEMON
# BEFORE:  LOGIN
# KEYWORD: shutdown

. /etc/rc.subr

name="php_fastcgi"
rcvar=`set_rcvar`

load_rc_config $name

: ${php_fastcgi_enable="NO"}
: ${php_fastcgi_user="www"}
#: ${php_fastcgi_bindaddr="127.0.0.1"}
#: ${php_fastcgi_bindport="9000"}
: ${php_fastcgi_socketpath="/tmp/fcgi.socket"}
: ${php_fastcgi_children="0"}
: ${php_fastcgi_max_requests="1000"}
: ${php_fastcgi_allowed_env=""}

export PHP_FCGI_CHILDREN=${php_fastcgi_children};
export PHP_FCGI_MAX_REQUESTS=${php_fastcgi_max_requests};

command="/usr/local/bin/php-cgi";
#command_args="-q -b ${php_fastcgi_bindaddr}:${php_fastcgi_bindport} &";
command_args="-q -b ${php_fastcgi_socketpath} &";
pidfile="/var/run/${name}.pid";

_allowed_env="ORACLE_HOME PATH USER PHP_FCGI_CHILDREN\
             PHP_FCGI_MAX_REQUESTS FCGI_WEB_SERVER_ADDRS";
_allowed_env="${_allowed_env} ${php_fastcgi_allowed_env}";

start_precmd=start_precmd;
start_postcmd="sleep 1;ps -U ${php_fastcgi_user} -o 'pid,command'|grep \
${command}|head -1|awk '{print \$1}' > ${pidfile}";
stop_postcmd=stop_postcmd;

start_precmd()
{
  export USER=${php_fastcgi_user};
  E=
  for i in ${_allowed_env}; do
      eval _val="\$$i";
      if [ "${_val}_x" != "_x" ]; then
          eval _add="$i=$_val";
          E="${E} ${_add}";
      fi
  done
  command="env - ${E} ${command}";
}

stop_postcmd()
{
   rm -f $pidfile
}

load_rc_config $name;

run_rc_command "$1";

Создаём нового пользователя от которого будем пускать rtorrent:
adduser
Username: rtorrent
Full name:
Uid (Leave empty for default):
Login group [rtorrent]:
Login group is rtorrent. Invite rtorrent into other groups? []: n
Group n does not exist!
Login group is rtorrent. Invite rtorrent into other groups? []: ^C
web# adduser
Username: rtorrent
Full name:
Uid (Leave empty for default):
Login group [rtorrent]: www
Login group is www. Invite rtorrent into other groups? []:
Login class [default]: 
Shell (sh csh tcsh nologin) [sh]:
Home directory [/home/rtorrent]:
Home directory permissions (Leave empty for default):
Use password-based authentication? [yes]:
Use an empty password? (yes/no) [no]: no
Use a random password? (yes/no) [no]: no
Enter password:
Enter password again:
Lock out the account after creation? [no]:
Username   : rtorrent
Password   : *****
Full Name  :
Uid        : 1002
Class      : 
Groups     : rtorrent
Home       : /home/rtorrent
Home Mode  :
Shell      : /bin/sh
Locked     : no
OK? (yes/no): yes
adduser: INFO: Successfully added (rtorrent) to the user database.
Add another user? (yes/no): no
Goodbye!

в /etc/rc.conf добавляем следущее:
lighttpd_enable="YES"
php_fastcgi_enable="YES"
php_fastcgi_user="www"
php_fastcgi_children="0"
php_fastcgi_max_requests="1000"
php_fastcgi_allowed_env=""
rtorrent_enable="YES"
rtorrent_args="-n -d /mnt/hdd2/p2p/bittorrent/downloads \
               -s /mnt/hdd2/p2p/bittorrent/sessions"
rtorrent_user="rtorrent"

тут rtorrent это пользователь от котрого будем пускать rtorrent, /mnt/hdd2/p2p/bittorrent путь куда будут
лететь торренты по умлочанию(в веб морде можно назначать любой путь), /mnt/hdd2/p2p/bittorrent/sessions
честно скажу - не знаю что оно там хранит, но подозреваю что .torrent файлы. Ко всем путям пользователь rtorrent должен естественно иметь полный доступ.
Далее:

touch /var/log/lighttpd.error.log
touch /var/log/lighttpd.access.log
chown www:www /var/log/lighttpd.error.log
chown www:www /var/log/lighttpd.access.log

Сделаем стартовый скриптик для rtorrent:
cat /usr/local/etc/rc.d/rtorrent
#!/bin/sh
#
#

# PROVIDE: rtorrent
# REQUIRE: LOGIN
# KEYWORD: shutdown

. /etc/rc.subr

name="rtorrent"
rcvar=`set_rcvar`

load_rc_config $name

: ${rtorrent_enable="NO"}
: ${rtorrent_args=""}
: ${rtorrent_user="rtorrent"}

command="/usr/local/bin/rtorrent"
screen="/usr/local/bin/screen"

start_precmd="${name}_prestart"
start_cmd="echo \"Starting ${name}.\"; su \
${rtorrent_user} -c '${screen} -A -m -d -S rtorrent \
${command} ${rtorrent_args} \
-o scgi_local=/tmp/rtorrent_rpc.socket'"

start_postcmd="${name}_poststart"

rtorrent_prestart()
{
        if [ -e "/tmp/rtorrent_rpc.socket" ]; then
                rm -R /tmp/rtorrent_rpc.socket
        fi
        return 0
}

rtorrent_poststart()
{
        while [ ! -e "/tmp/rtorrent_rpc.socket" ];
        do
                sleep 0.1
                echo waiting for /tmp/rtorrent_rpc.socket creation...
        done
                echo done
                chown www /tmp/rtorrent_rpc.socket
                return 0
}

#stop_postcmd="rm -R /var/tmp/rtorrent_rpc.socket"

run_rc_command "$1"

Обратите внимание на символы "\" в конце строк, их не должно быть в реальном файле, это символ переноса строки.

Теперь вебморда, взять её нужно отсюда:
fetch http://rutorrent.googlecode.com/files/rtorrent-2.5.tar.gz

Распакуем содержимое архива в /usr/local/www/rtorrent:
tar xvf rtorrent-2.5.tar.gz -C /usr/local/www/

Подрихтуем конфиг:
cat /usr/local/www/rtorrent/config.php
<?php
    define('HTTP_USER_AGENT', 'Mozilla/5.0 (Windows; U;
 Windows NT 5.1; pl; rv:1.9) Gecko/2008052906 Firefox/3.0');
    define('HTTP_TIME_OUT', 30);
    define('HTTP_USE_GZIP', true);

    define('RPC_TIME_OUT', 15);         // in seconds
    define('DO_DIAGNOSTIC', true);
// temp directory for uploaded torrents, without tail slash
    $uploads = './torrents';
// settings directory, without tail slash
    $settings = './settings';

// Something like /bin/php. If empty, will be founded in PATH.
    $pathToPHP = '';
// Something like /bin/curl. If empty, will be founded in PATH.
    $pathToCurl = '';

     $scgi_port = 0;
     $scgi_host = "unix:///tmp/rtorrent_rpc.socket";
?>

Создадим файлик авторизации в веб морде:
echo rtorrent:XML-RPC:`echo -n rtorren:XML-RPC:my_pass | md5 | cut -b -32` >> \
/usr/local/www/rtorrent/rtorrent_users

Где rtorren - имя пользователя
и my_pass - пароль.
Скажу сразу - пароль по данной схеме никак не шифруется при передаче на сервер, значит его могут перехватить. Во избежание этого надо крутить https к lighttpd, что выходит за рамки этой статьи, но, если надо, то я это опишу.

Э, надо бы ещё права на стартовые скрипты дать:
chmod +x /usr/local/etc/rc.d/rtorrent
chmod +x /usr/local/etc/rc.d/php_fastcgi

Да и на веб морду:
chmod -R 755 /usr/local/www/rtorrent
chown -R www:www /usr/local/www/rtorrent

Всё, пробуем:
/usr/local/etc/rc.d/lighttpd start
/usr/local/etc/rc.d/php_fastcgi start
/usr/local/etc/rc.d/rtorrent start
http://host_ip/rtorrent

Добавление1.
По просьбам трудящихся даю перевод конфига rtorrent'a:

# This is an example resource file for rTorrent. Copy to
# ~/.rtorrent.rc and enable/modify the options as needed. Remember to
# uncomment the options you wish to enable.

# Maximum and minimum number of peers to connect to per torrent.
# максимальное и минимальное число пиров на каждый торрент
#min_peers = 40
#max_peers = 100

# Same as above but for seeding completed torrents (-1 = same as downloading)
# Тоже самое что и выше, только для сидируемых торрентов
# (-1 для тех значений что на скачках)
#min_peers_seed = 10
#max_peers_seed = 50

# Maximum number of simultanious uploads per torrent.
# Максимально число одновременных отдач на торрент
#max_uploads = 15

# Global upload and download rate in KiB. "0" for unlimited.
# глобальная скорость скачивания и отдачи. "0" без лимита
#download_rate = 0
#upload_rate = 0

# Default directory to save the downloaded torrents.
# Директория для сохранения торрентов
#directory = ./

# Default session directory. Make sure you don't run multiple instance
# of rtorrent using the same session directory. Perhaps using a
# relative path?
# Директория для хранения файлов сессий, не допускается запуск более
# одно rtorrent'а с заданием одной и той же диретории.
#session = ./session

# Watch a directory for new torrents, and stop those that have been
# deleted.
#Сиотрим директорию на наличие новых торрентов для скачки,
# и тормозим торрент если
# если .torrent файл удалён(можно по самбе накилывать и удалять, прим. автора)
#schedule = watch_directory,5,5,load_start=./watch/*.torrent
#schedule = untied_directory,5,5,stop_untied=

# Close torrents when diskspace is low.
# закрываем торренты если мало места на харде
#schedule = low_diskspace,5,60,close_low_diskspace=100M

#тормозим торренты если множитель отдачи достиг определённый процент
#или же если достигнут лимит в байтах
#или же достигнут финальный лимит сножителя отдачи в процентах
# Stop torrents when reaching upload ratio in percent,
# when also reaching total upload in bytes, or when
# reaching final upload ratio in percent.
# example: stop at ratio 2.0 with at least 200 MB uploaded, or else ratio 20.0
#schedule = ratio,60,60,"stop_on_ratio=200,200M,2000"

# The ip address reported to the tracker.
# айпишник сообщаемый трекеру
#ip = 127.0.0.1
#ip = rakshasa.no

# The ip address the listening socket and outgoing connections is
# bound to.
# биндим слушающий сокет и исходящии соединения на этот адрес
#bind = 127.0.0.1
#bind = rakshasa.no

# Port range to use for listening.
# диапазон портов для прослушки
#port_range = 6890-6999

# Start opening ports at a random position within the port range.
#лькрываем порты внутри диапазоа со случайных значений
#port_random = no

# Check hash for finished torrents. Might be usefull until the bug is
# fixed that causes lack of diskspace not to be properly reported.
#проверяем хеш скаченного торента. Может быть полезно до фикса бага,
#из-за которого свободное место отображается неверно.
#check_hash = no

# Set whetever the client should try to connect to UDP trackers.
#разрешает клиенту испольование UDP трекеров
#use_udp_trackers = yes

# Alternative calls to bind and ip that should handle dynamic ip's.
#альтернативны вызовы бинда и IP для управления динамическим адресом
#schedule = ip_tick,0,1800,ip=rakshasa
#schedule = bind_tick,0,1800,bind=rakshasa

# Encryption options, set to none (default) or any combination of
# the following:
# allow_incoming, try_outgoing, require, require_RC4,
# enable_retry, prefer_plaintext
#
# The example value allows incoming encrypted connections, starts unencrypted
# outgoing connections but retries with encryption if they fail, preferring
# plaintext to RC4 encryption after the encrypted handshake
# опции шифрования, поумолчанию не шифрует.
#пример разрешает входящие зашифрованние соединения, начинать нешифрованные
#имохдящие соединения, но повторять шированными если не получилось.
#Предпочтение отдаётся откытому текст вместо RC4, после неудачного шифрования
# encryption = allow_incoming,enable_retry,prefer_plaintext

# Enable DHT support for trackerless torrents or when all trackers are down.
# May be set to "disable" (completely disable DHT), "off" (do not start DHT),
# "auto" (start and stop DHT as needed), or "on" (start DHT immediately).
# The default is "off". For DHT to work, a session directory must be defined.
# разрешаем dht, подробнее читаем тут:http://ru.wikipedia.org/wiki/DHT
# dht = auto

# UDP port to use for DHT.
# порт для ипсользования DHT.
# dht_port = 6881

# Enable peer exchange (for torrents not marked private)
#разрешить обмен пирами(если торренты не отмечены как частные)
# peer_exchange = yes

#
# Do not modify the following parameters unless you know what you're doing.
#не трогайте эти параметры если не знаете что делаете =)

# Hash read-ahead controls how many MB to request the kernel to read
# ahead. If the value is too low the disk may not be fully utilized,
# while if too high the kernel might not be able to keep the read
# pages in memory thus end up trashing.
# кол-во памяти запрашиваемого у ядра, малое значение может вызвать
#простой дисковой подсистемы, большое к сбросу страниц памяти.
#hash_read_ahead = 10

# Interval between attempts to check the hash, in milliseconds.
#интервал между попытками хеширования
#hash_interval = 100

# Number of attempts to check the hash while using the mincore status,
# before forcing. Overworked systems might need lower values to get a
# decent hash checking rate.
#кол-во попыток проверки хеша во время mincore(хер знает что это) статуса,
#перед принуждением. Нагруженные системы должны использовать меньшие
#значени для получения нормальной скорости проверки хеша.
#hash_max_tries = 10

От себя хочу сказать спасибо автору переделки webui, к сожалению я его не предупредил о том что выкладываю линк на его труд.


статья в вики
офсайт webui, кстати, называется теперь "rutorrent" :)



размещено: 2009-01-27,
последнее обновление: 2009-10-01,
автор: opt1k


adre, 2009-04-18 в 12:13:57

хмм...  а говорили телепатов нету =)))
вчера крутил transmission - читать было лень, оказывается ему иксы нужны =((

Garick, 2009-04-19 в 0:40:24

Плохо крутили.
Трансмишену не нужны иксы веб морда там встроена нет необходимости устанавливать кучу ненужного есть проги клиенты

sool, 2009-05-29 в 8:21:30

Под apache20 и 22 (13 не пробывал)
httpd.conf
-----------------------------------------------------------
LoadModule scgi_module        libexec/apache22/mod_scgi.so
SCGIMount /RPC2   127.0.0.1:5000
-----------------------------------------------------------
соответственно собрать с подержкой SCGI

gloom, 2009-06-20 в 17:58:34

если php уже установлен то
cd /usr/ports/net/php5-xmlrpc
make install clean
проверяем
cat /usr/local/etc/php/extensions.ini |grep extension=xmlrpc.so
ll /usr/local/libexec/apache22/mod_scgi.so

adre, 2009-07-01 в 10:19:03

cd /usr/ports/www/py_scgi && make install

adre, 2009-07-02 в 9:22:37

да и чтобы корректно работало с данной мордой надо либо ставить rtorrent-devel, либа с сайта собрать самому последнюю версию, а то глюки различные могут ловиться

opt1k, 2009-07-04 в 16:12:48

/usr/ports/www/py_scgi - такого порта я не нашёл, зачем его ставить?
у вас глюки ловились?

Виталий, 2009-07-15 в 16:36:43

Подскажите, а как быть если уже установлен и работает Apache на сервере и его вырубать нельзя?

uHk, 2009-07-24 в 18:45:58

\"Настройки rTorrent, изменяемые пользователем через соответствующий диалог ruTorrent валидны только на время текущей сессии rTorrent. После рестарта последнего они будут утеряны.\" - цитата с офф сайта

lissyara, 2009-07-24 в 19:32:52

"
'
`
test

IRON, 2009-08-13 в 0:18:36

Есть у меня два сервака. Один с большим винтом и Апачем. Другой с PHP и Апачем. На первом запущен rtorrent, на втором пытаюсь поднять rutorrent (так как ему PHP нужен). К сожалению ничего не получилось, так как rutorrent-у почему-то нужно иметь доступ в папку sessions, которую он ищет почему-то локально на втором сервере. Не понятно чем разработчики думали :(.

opt1k, 2009-08-29 в 5:37:09

uHk:
будь добр, дай на это линк, почитаю
IRON: Вас спасёт НФС или самба.

cat_ua, 2009-09-15 в 16:06:01

я так понял что правильно должно быть так?:

cd /usr/ports/lang/php5-extensions
отмечаем xml, xmlrpc, pcre, curl

cd /usr/ports/net-p2p/rtorrent
ставим галку только напротив xmlrpc

а то не мог понять где в rtorrent-е pcre и curl выставить...

opt1k, 2009-10-01 в 23:18:58

cat_ua: спасибо, поправил.

Zilbi, 2009-10-17 в 17:24:08

Поправьте заодно и в wiki

Olax, 2010-01-06 в 9:41:44

Сделал все по статье.
запускается, соединяется, но статус торента постоянно в паузе.
скачивание не идет
в чем проблема может быть?

frosty, 2010-06-03 в 15:20:52

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

АФТАР добавь в ман

1.
mkdir -p /var/run/lighttpd
chown www:www /var/run/lighttpd

2. раскаменитруй в конфиге lighttpd
#                                   \"bin-path\" => \"/usr/local/bin/php-cgi-cgi\"



 

  Этот информационный блок появился по той простой причине, что многие считают нормальным, брать чужую информацию не уведомляя автора (что не так страшно), и не оставляя линк на оригинал и автора — что более существенно. Я не против распространения информации — только за. Только условие простое — извольте подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой, незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
  Если соизволите поставить автора в известность — то вообще почёт вам и уважение.

© lissyara 2006-10-24 08:47 MSK

Время генерации страницы 0.0468 секунд
Из них PHP: 66%; SQL: 34%; Число SQL-запросов: 30 шт.
У Вас отключено GZIP-сжатие в браузере. Размер страницы 58061