Файлопомойка. Часть 2.
Продолжаю собирать нечто похожее на файловый сервер. Очередь дошла до торрент-качалки. Среди всего разнообразия остановился на 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;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; 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" > 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 напишу в третьей части. Поспать бы…
Добрый день. Установил 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]
Как это побороть?
@Владимир
Я так понимаю, проблема в том, что rtorrent сохраняет имена в Unicode, поэтому чтобы имена отображались в консоли как положено, нужно изменить системную локаль. У вас скорей всего win1251 или koi8r.
Почитайте здесь: http://www.linux.org.ru/forum/desktop/2572777
Обсуждается та же проблема.