Файлопомойка. Часть 2.

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

К делу…

Сразу отмечу, что в процессе установки могут потребоваться дополнительные библиотеки, установка которых в данном мане не описана. Так что как не крути, а Google – лучший друг и наставник.

Установка и настройка rTorrent

Сайт разработчика библиотеки libtorrent и rtorrent’a: http://libtorrent.rakshasa.no/

Дя начала скачиваем последнии версии libtorrent’a b rtorrent’a (на момент написания заметки последними были 0.12.6 и 0.8.6, соответственно). Лежат здесь: http://libtorrent.rakshasa.no/downloads/

Либо дедовским методом, т.е. ручками:

wget http://libtorrent.rakshasa.no/downloads/libtorrent-0.12.6.tar.gz
wget  http://libtorrent.rakshasa.no/downloads/rtorrent-0.8.6.tar.gz

В первую очередь разворачиваем libtorrent:

tar zxvf  libtorrent-0.12.6.tar.gz
cd libtorrent-0.12.6.tar.gz
./autogen.sh
./configure && make && make install

Во имя грядущего счастья нужно еще прикрутить XMLRPC-C (Сайт проекта: http://xmlrpc-c.sourceforge.net/)

Утягиваем новенькие сорцы:

# исходники упадут в папочку xmlrpc-c
svn co  http://xmlrpc-c.svn.sourceforge.net/svnroot/xmlrpc-c/advanced xmlrpc-c

Ну или можно просто скачать tarball 🙂 http://xmlrpc-c.svn.sourceforge.net/viewvc/xmlrpc-c/advanced.tar.gz?view=tar

Процесс сборки и установки ничем принципиально не отличается

./configure --prefix=/usr
# чтоб библиотечка упала куда надо, а то впоследствии конфиг rTorrent
#ее не увидит я об этом ключе не знал, поэтому потом долго не мог понять,
# почему конфигуратор rTorrent ее не видит пофиксилось в итоге просто
# сначала whereis xmlrpc-c ,а потом
# export PKG_CONFIG_PATH=/path/to/your/xmlrpc/lib
make && make install

Теперь очередь rTorrent’a:

./autogen.sh
./configure --prefix=/usr --with-xmlrpc-c
make && make install

–with-xmlrpc-c – чертовски важный ключ, без него rTorrent не откроет порт прослушки для взаимодействия с WebUI.

Далее в каталоге юзера нужно создать файл конфигурации .rtorrent.rc

$ cat <<EOF >>~/.rtorrent.rc
port_range = 10000-10005
check_hash = yes
directory = /where/to/save/torrent/data
session = /where/to/save/session/data
# очень полезная опция. rtorrent ,будет мониторить папку на предмет
# появления в ней новых торрент-файлов и автоматически ставить их
# на закачку. Особую актуальность приобретет, когда будем
# настраивать загрузку торрентов через RSS
schedule = watch_directory,5,5,load_start=~/torrent/*.torrent
tos = default
upload_rate = 0
download_rate = 0
EOF

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

Плюс нужно обязательно добавить строку:

# понадобится позже для WebUI
scgi_port = 127.0.0.1:5000

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

Для этих целей сначала установим screen. Тут я поленился собирать его из исходников, поэтому просто:

yum install screen

А дальше делаем вот такой скрипт, который гнусно скопипастен отсюда: http://www.fedoramd.org/wiki/Rtorrent

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#!/bin/bash
#
# Starting rtorrent in a screen session as daemon
# Author: Vasile Vsx
#
# chkconfig: 2345 50 01
#
# description: start rtorrent detached
# processname: rtorrent
 
# source function library
. /etc/rc.d/init.d/functions
 
# Source networking configuration.
[ -r /etc/sysconfig/network ] && . /etc/sysconfig/network
 
# Check that networking is up.
[ "\${NETWORKING}" = "no" ] && exit 0
 
if [ -f /etc/sysconfig/rtorrent ]; then
        . /etc/sysconfig/rtorrent
fi
 
if [ -z \$RTORRENT_USER ]; then
        exit 0
fi
 
RETVAL=0
 
start() {
        echo -n "Starting rtorrent: "
        daemon --user \$RTORRENT_USER /usr/bin/screen -dmS rtorrent /usr/bin/rtorrent \$OPTIONS
        RETVAL=\$?
        echo
}
 
stop() {
        echo -n "Stopping rtorrent: "
        killproc rtorrent -INT
        RETVAL=\$?
        echo
}
 
restart() {
        stop
        start
}
 
case "\$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  restart)
        restart
        ;;
  status)
        status rtorrent
        ;;
  *)
        echo $"Usage: \$0 {start|stop|status|restart}"
        exit 1
esac
 
exit $RETVAL

Отдельно обращаю внимание на символ ‘\’. В конечном скрипте его уже не должно быть, поэтому копипаст в текстовый файл подразумевает удаление ‘\’ ручками.

Выше исходник, а ниже, соответственно куда его сохранять и что с этим файлом потом делать.

touch /etc/rc.d/init.d/rtorrent
cd /etc/rc.d/init.d/
chmod a+x rtorrent
chkconfig --add rtorrent

Плюс определяем юзера из под которого будез запускаться rTorrent. Никто конечно не запрещает указать root’a, но это не изящно. А вот на что нужно обратить внимание, так это на то, чтоб у этого юзера были права на чтение\запись, указанных в конфиге rTorrent’a папок. И еще, rTorrent будет искать конфиг в домашней паки юзера из под которого он запущен, поэтому целесообразно запускать его от того пользователя в чьей папке лежит конфиг.

cat <<EOF >>/etc/sysconfig/rtorrent
RTORRENT_USER=username
EOF

Запуск остановка rTorrent’a осуществляется командами:

/sbin/service rtorrent start
/sbin/service rtorrent stop

Для подключения к сессии rTorrent’a: screen -r

Выход из сессии осуществляется комбинацией клавиш СTRL+A D.

На данном этапе установку rTorrent’a можно считать завершенной. Софтина будет весело перекидываться пакетами с другими пирами, при этом не нагружая систему. Лепота.

RSS Downloader

Наличие действующего rTorrent’a – это конечно хорошо, но немного автоматизации не помешает. Избалованный RSS загрузчиком uTorrent, захотел что-то подобное и здесь. На выбор были предложены разные скрипты в хомяке автора rTorrrent’a, но мне под руку попался более легковесный и простой в использовании, хотя, возможно, ему не достает гибкости и требуются кое-какие костыли, но со своей задачей он справляется.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
# This is released under the GPL
# A tvrss script by chochem, a reworking of ughknight's (http://ubuntuforums.org/showthread.php?t=292386&amp;amp;page=2)
# Functions much like ughknights, except that it checks the feed against a list
# of already downloaded torrent files, then gets all the new ones.
# Also added functions are error checking and removing old unused torrent files
 
# REQUIRES:
# Text files containing a single feed url from tvrss.net (keep these in the 'tvrssdir' folder)
# "Xmlstarlet" to parse the feed (to get it, enter: "sudo apt-get install xmlstarlet")
# A torrent client that lets you use a "watch" folder (torrent files in said folder are automatically loaded)
 
# Please set the two directory variables and the waiting period under 'SETTINGS' to reflect your setup.
# The script will make the directories if they do not already exist.
# Though care has been taken to protect filenames and locations containing spaces, they should
# still be avoided in the directory and feed file names if at all possible.
 
# SETTINGS - CUSTOMIZE ACCORDING TO YOUR SETUP
# tvrssdir is the directory in which you put the files containing feed urls (and tvrss keeps its log and temp files)
tvrssdir=~/tvrss
# watchdir is the directory your torrent client checks for new torrents to load automatically
watchdir=~/rtorrentwatch
# waitingperiod is the time in hours between checks for new torrents (accepts decimals, e.g. 0.25 for 15 minutes)
waitingperiod=1
# maxage is used in a routine that deletes old torrent files from a show subscription. Torrents more than this number of months old gets deleted.
maxage=1
# END OF SETTINGS
 
while [ 1 ]; do
 
if [ ! -d "$tvrssdir" ]; then mkdir "$tvrssdir"; fi
if [ ! -d "$watchdir" ]; then mkdir "$watchdir"; fi
 
# For-each-tvshow-subscription-do loop starts here
for tvshow in $(ls "${tvrssdir}"); do
 
#Setting temporary files and variables
newtorrentscount=0
feedurl=$(cat "${tvrssdir}/${tvshow}")
tmpxml="${tvrssdir}/.tmpxml"
oldurllist="${tvrssdir}/.${tvshow}-oldurllist"
 
# Get the rss feed
echo "Working on the show \"$tvshow\""
echo "Getting the rss feed..."
wget -q -O "$tmpxml" "$feedurl" 2> /dev/null &amp;amp;&amp;amp; echo "Feed file downloaded. Parsing file for new torrents..." || (
echo "The feed \"$tvshow\" at \"$feedurl\" could not be downloaded."
echo -e "\r\033[7mCheck the address and/or your connection.\033[0m"; echo
rm "$tmpxml"
)
 
# On condition that wget got hold of a file...
if [ -e "$tmpxml" ]; then
 
# Parse the feed file for torrent links
touch "$oldurllist"
oldurlstring=$(cat "$oldurllist")
currenturlstring=$(xmlstarlet sel -t -m "/rss/channel/item/link" -v "concat(.,' ')" "$tmpxml" 2> /dev/null)
 
# Check for no results (this covers an empty feed as well as a parsing error)
if [ -z "$currenturlstring" ]; then
echo  -e "\r\033[7mA file has been downloaded but parsing it resulted in no URLs.\033[0m"
echo "Either the address in the ${tvrssdir}/${tvshow} file does not refer to a tvrss.net feed or the feed is empty."; echo
else
# Check for URLs not in the log (the show's oldurllist), get new ones, add the entry to the log and inform user
for url in $(echo "$currenturlstring"); do
if [[ ! "$oldurlstring" =~ "$url" ]]; then
echo "$url is new. Getting torrent file..."
wget -q -O "${watchdir}/${tvshow}_$(date +%y%m%e)_$(date +%H%M%S%N).torrent" "$url"
echo "$url" >> "$oldurllist"
let "newtorrentscount++"
fi
done
 
# Evaluate / user output
if [ "$newtorrentscount" -gt 0 ]; then
echo -e "\r\033[7mFound ${newtorrentscount} new torrent(s) for \"$tvshow\"\033[0m"; echo
else
echo -e "\r\033[7mNo new torrents for \"$tvshow\"\033[0m"; echo
fi
 
# No results condition ends...
fi
 
# Cleaning up (remove tmpxml)
rm "$tmpxml"
 
# wget condition ends...
fi
 
# Check for old torrent files for this show and remove any older than two months
now=$(date +%s)
for filename in $(ls ${watchdir}/${tvshow}_*.torrent 2> /dev/null); do
birthday=$(date +%s -r "${filename}")
agesecs=$(($now-$birthday))
agemonths=$(($agesecs/2629743))
if [ $agemonths -gt $maxage ]; then
echo "Cleaning up old torrent file for \"$tvshow\"..."
rm "$filename"
fi
done
 
# For-each-tvshow-subscription-do loop ends...
done
 
########ANTIPOD EDIT#######
#Added this line too to work proper with real Cron.
exit
# Fake cron is the below 2 commands
# I've commented the next 2 strings to make this script run only once,
# because i'm going to use a real cron job and i don't need this loop.
# echo "Sleeping for ${waitingperiod} hour(s)..."
# sleep ${waitingperiod}h
 
# Neverending loop ends...
done
exit

Чтобы все это творчество заработало нужен XML-парсер XMLStarlet, ему в свою очередь для жизнедеятельности требуются libxml2, libxslt и libiconv. Ленимся и ставим все это барахло из репозитория

yum install libxml2 libxslt libiconv xmlstarlet

В мане по развертыванию скрипта было сказано, что строку 59:

 currenturlstring=$(xmlstarlet sel -t -m "/rss/channel/item/link" -v "concat(.,' ')" "$tmpxml" 2> /dev/null)

Нужно заменить на:

currenturlstring=$(xml sel -t -m "/rss/channel/item/link" -v "concat(.,' ')" "$tmpxml" 2> /dev/null)

Собственно говоря, разница исключительно в команде, которая этот старлет запускает, у автора мана она почему-то была xml, у меня так и была xmlstarlet. Так что нужно тупо тыркнуться в консоль и выяснить на какую кличку этот парсер отзывается.

Что до настройки самого скрипта, то с ним все предельно ясно. Есть четыре переменные, их и редактируем.

# здесть лежат файлы со ссылками на rss-фиды
tvrssdir=~/tvrss
# папка, которая мониторится rtorrent'ом, т.е. туда будут падать новые торренты
watchdir=~/rtorrentwatch
# интервал проверки фидов (можно использовать десятые доли,
# например 0.25 - 15 минут)
waitingperiod=1
# удаление торрентов старше определенного числа месяцев
maxage=1

Плюс в папке tvrss текстовые файлы со ссылкой на rss-фид:

# cd /your/tvrss/dir
# echo "url-of-your-feed" &gt; NameOfTheShow

Сам скрипт я сохранил в /usr/sbin и сделал chmod a+x  /usr/sbin/rss_downloader

Последний штрих – создание сценария cron, чтоб вся эта ерунда запускалась каждые 10 минут.

cat <<EOF >>/tmp/rss_downloader_cron
SHELL=/bin/bash
MAILTO=username
*/10 * * * * /usr/sbin/rss_downloader
EOF

Подсовываю этот сценарий cron’y:

crontab /tmp/rss_downloader_cron

Казалось бы, что все хорошо, но есть одна проблема, скрипт парсит фид и выдирает оттуда абсолютно все торренты, то есть никакой фильтрацией и не пахнет. Это конечно не есть хорошо. В очередной раз пойдя на поводу у лени для обработки исходных фидов с трэкеров воспользовался сервисом Yahoo Pipes.

Про установку и настройку WebUI напишу в третьей части. Поспать бы…

2 комментария к “Файлопомойка. Часть 2.”

  1. Добрый день. Установил 0.8.6и наткнулся на проблему с отображением руссках назаваний в rtorrent. пишет вот такую абракадабру
    [View: main]
    M-PM-?M-PM->M-Q~BM-PM-5M-Q~@M-Q~OM-PM-=M-PM-=M-PM-0M-Q~O M-PM-:M-PM->M-PM-<M-PM-=M-PM-0M-Q~BM-PM-0
    done 7365,8 MB Rate: 0,0 / 0,0 KB Uploaded: 8220,5 MB [T R: 1,12]

    Как это побороть?

  2. @Владимир

    Я так понимаю, проблема в том, что rtorrent сохраняет имена в Unicode, поэтому чтобы имена отображались в консоли как положено, нужно изменить системную локаль. У вас скорей всего win1251 или koi8r.
    Почитайте здесь: http://www.linux.org.ru/forum/desktop/2572777
    Обсуждается та же проблема.

Оставить комментарий