Transmission: контроль за несколькими директориями

зкщпкфььук. текстЕсли вы читаете мой блог, то знаете, что я люблю расставлять мини-сервера без мониторов и под управлением Ubuntu. Сервера выполняют разнообразные задачи, начиная от видеонаблюдения и заканчивая обработкой событий на основе Node-RED. Помимо всего прочего, некоторые из моих серверов нагружаются еще и обязанностью по скачиванию через торрент протокол. Для чего они это делают — умолчим, а сама задача по скачиванию осуществляется посредством популярнейшего средства Transmission.

При установке торрент-клиента Transmission на сервере без монитора и вообще без графического интерфейса ему нужно как-то передавать торрент-файлы, того, что он должен скачать. Обычно эту операцию можно проделать через а) Web-интерфейс Transmission, б) RPC-вызов из внешнего приложения, например, Transmission Remote GUI, в) сохранить торрент-файл в папку на сервере за которой следит сам «демон» Transmission.

Через Web-интерфейс работать, конечно, можно. Но не удобно. Нужно сохранить файл к себе на компьютер, потом его загрузить через страничку. Вариант с приложением удобнее, особенно если оно вызывается как обработчик определенных файлов, в нашем случае — torrent-файлов. Ну и тот способ, которым пользуюсь я, подразумевает просто мониторинг папки на сервере. Мне достаточно сохранить torrent-файл в эту папку и далее «демон» автоматически его загрузит и начнет скачивать.

Мониторинг серверной папки — штука очень удобная. Не нужно делать никаких лишних телодвижений. Сохранил и забыл. Но есть у этого способа одно неудобство. Что складывается в эту папку, скачивается в одну директорию на сервере. Что, согласитесь, несколько неудобно. В одну папку складываются книги, программы, фильмы, телесериалы… Получается такой маленький коллапс и невыносимая мешанина. Тут бы организовать несколько папок слежения с последующим раскладыванием скачанного по разным папкам на сервере. К сожалению, Transmission не умеет мониторить сразу несколько папок и соответственно не умеет автоматически раскладывать скачиваемое по нужным папкам. Перенести укаченное по нужным директориям, разумеется, можно и позже. Но это же лишнее телодвижение.

"watch-dir": "/home/Ваш_пользователь/Torrents", 
"watch-dir-enabled": true

Таким образом происходит настройка директории для отслеживания torrent-файлов в конфиге Transmission.

Но программисты народ упорный. И если где-то можно себе облегчить жизнь, то они упарываются и изобретают что-то, что позволяет не жмакать лишний раз по клавиатуре. Вот и некий Тейлор, работающий на какой-то Bay Photo, решил исправить несправедливость мира и написал простейший скрипт, позволяющий мониторить дополнительные директории и если там появляются torrent-файлы, то передавать их в Transmission через RPC.

Установка скрипта происходит очень просто. У вас в системе уже должен быть установлен python, если нет, то вероятно, что он установится в процессе установки менеджера пакетов pip (используется для управления пакетами на Python). Соответственно, если менеджер пакетов не установлен, то устанавливаем его обычным способом, например, через apt install pip.

После установки pip необходимо установить пакет, позволяющий скриптам подключаться к Transmission посредством RPC. Осуществляется эта процедура через pip install transmissionrpc. Далее скрипты скачиваются с GitHub какого-то Тейлора (ссылку смотри в заключительной части) в виде архива (тогда их нужно будет распаковать) или прямо в виде скриптов. В комплекте идет два скрипта startup.sh и main.py. Первый это то, что будет непосредственно запускаться операционной системой, поэтому ему нужно установить признак исполняемого файла. Ставить ли признак исполняемости на пользователя, группу или всех, зависит от того, под кем будет запускаться скрипт в дальнейшем.

Затем необходимо отредактировать скрипт main.py, внести в него конкретные директории для отслеживания и конкретные директории куда Transmission будет складывать скаченное. Проделывается сия операция легко и просто, каталоги вносятся в следующие переменные:

# Watch directories
watch_tv = '/home/vlad/Tr_TV'
watch_movie = ''
watch_music = ''

# Complete download directories
download_dir_tv = '/home/vlad/Trans_TV'
download_dir_movie = ''
download_dir_music = ''

На примере выше для отслеживания скриптом у меня выбрана директория /home/vlad/Tr_TV и торренты из нее будут скачиваться в /home/vlad/Trans_TV. Но заполнить переменные недостаточно. Нужно добавить их в пул отслеживания, а делается это вот такой вот строчкой add(watch_tv, download_dir_tv), которая добавляется почти в конец скрипта (там они уже есть для указанных выше строчек). Важно, если у вас не заполнены какие-то переменные, в приведенном примере то watch_movie, watch_music, download_dir_movie и download_dir_music, то нужно либо закомментировать (символ # в начале строки) либо просто удалить соответствующие им команды add. Т.е. в моем случая мне необходимо избавиться от вот этих вот строчек:

add(watch_movie, download_dir_movie)
add(watch_music, download_dir_music)

Иначе, скрипт будет выдавать ошибку. Еще одним моментом которому стоит уделить внимание является настройка скрипта на конкретную инсталляцию Transmission:

client = transmissionrpc.Client(
address='127.0.0.1',
port='9091',
user='',
password=''
)

В этой секции address и port указывают, где именно слушает Transmission вызовы RPC. В данном случае он запущен на том же сервере, что и скрипт, поэтому указывается адрес loopback интерфейса. Важно не забыть про user и password иначе подключиться к Transmission по RPC не выйдет. Со стороны Transmission за настройку RPC отвечают следующие параметры:

"rpc-authentication-required": false, 
"rpc-bind-address": "0.0.0.0", 
"rpc-enabled": true, 
"rpc-password": "Пароль", 
"rpc-port": 9091, 
"rpc-url": "/transmission/", 
"rpc-username": "Пользователь", 
"rpc-whitelist": "127.0.0.*,192.168.1.*", 
"rpc-whitelist-enabled": true,

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

В скрипте main.py можно обратить внимание еще на один параметр time.sleep(60), идущий самой последней строкой. Это интервал в секундах, через который происходит пересканирование всех указанных в скрипте директорий. После настроек можно запустить скрипт и проверить работоспособность всей схемы: скопировать torrent-файл в нужную директорию, убедиться, что через некоторое время Transmission его подхватил. Если вносились измерения в конфигурации Samba или Transmission, то их следует перезапустить перед проверкой. Затем можно настроить автоматический запуск скрипта при старте системы. Я сделал это при помощи systemd.

Итак, создаем от суперпользователя в каталоге /etc/systemd/system файл, ну например, myscript.service и заполняем его примерно следующим:

[Unit]
Description=Transmission multiple dir watch
After=multi-user.target

[Service]
Type=idle
ExecStart=/home/vlad/trms/startup.sh

[Install]
WantedBy=multi-user.target

Далее файл сохраняем и запускаем следующие команды (все из контекста суперпользователя):

  • systemctl daemon-reload — перезагружаем описания процессов «демонов»;
  • systemctl enable mysrcipt — разрешаем запуск нашего скрипта;
  • systemctl start mysrcipt — запускаем наш скрипт прямо сразу;
  • systemctl status mysrcipt — проверяем, что все запустилось чётко, если нет, то проверяем, где у нас вкралась опечатка.

После установки скрипта жить стало немного проще, прекратилось скопище различных по типу скаченных файлов.

Update22: При использовании скрипта на новом сервере, с последней версией операционной системы Ubuntu, столкнулся с тем, что в системе уже установлен Python3, который по синтаксису не совсем совместим с языком, Python2, на котором и написан скрипт неким Тейлором. Можно было, конечно, поправить скрипт на совместимость с Python3, но время поджимало и пришлось установить дополнительно в систему Python2, поправить ссылку на интерпретатор в начале скрипта и прописать пути к дополнительным пакетам, которые использует скрипт и установленный пакет transmissionrpc.

#!/usr/bin/python2

import time
import os, sys
import os.path as path
sys.path.append('/home/vlad/.local/lib/python3.10/site-packages/')
sys.path.append('/usr/lib/python3/dist-packages')
import transmissionrpc
import datetime

Собственно в первой строке изменил путь к вызову устаревшего интерпретатора. Далее, через директиву sys.path.append добавил путь к установленному пакету transmissionrpc (он установлен в домашнюю директорию) и к стандартным пакетам от Python3. Аналогично пришлось поправить путь к Python2 и в файле startup.sh.

Полезные ссылки:

  1. GitHub страничка некоего Тейлора.
  2. Какой-то Bay Photo на который работает какой-то Тейлор.
  3. Страничка какого-то Тейлора, работающего на какой-то Bay Photo, со скриптом мониторинга за несколькими каталогами.
  4. «Хомяк» Transmission и их же GitHub.
  5. Transmission Remote GUI.
  6. Менеджер пакетов pip.


Подписаться
Уведомить о
guest

5 комментариев
Старые
Новые
Межтекстовые Отзывы
Посмотреть все комментарии
matrix
matrix
2 лет назад

Cпасибо за мануал, пытался поднять на Debian, но в логах скрипта непонятная ошибка, файлы разные подкладывал.
[2022-02-08 23:37:47] Started watch script.
Current watch directories:
Movies: /media/WD/Torrents/Torrents_HD
Music: /media/WD/Torrents/Torrents_Music
Current download directories:
Movies: /mnt/HD/HD_a2/Public/HD
Music: /mnt/HD/HD_a2/Public/Music
[2022-02-08 23:37:47] Adding torrent: 1.torrent
[2022-02-08 23:37:47] Error encountered: Query failed with result "invalid or corrupt torrent file".
[2022-02-08 23:37:47] Searching directories.
[2022-02-08 23:37:58] Adding torrent: 1.torrent
[2022-02-08 23:37:58] Error encountered: Query failed with result "invalid or corrupt torrent file".

matrix
matrix
Ответить на  kvv213
2 лет назад

"то всё гуглил, не помогло к сожалению. Надоело красноглазить.
Будем пользовать по стаhинке watch-dir

Дмитрий
Дмитрий
1 год назад

Добрый день!
Вероятно, в статье ошибка, где указано расположение systemd сервисов. По крайней мере в Debian это /etc/systemd/system
Мелочь, а пришлось погуглить)
Так же пришлось помучаться с установкой pip и transmssionrpc , чтобы все друг друга видели и понимали именно ту версию которую надо. Пришлось зачистить весь python командой apt-get remove python* и уже потом при помощи команды снизу установить необходимую версию. Помогла такая команда. Возможно тоже стоит добавить в статью

sudo apt update
curl https://bootstrap.pypa.io/pip/2.7/get-pip.py --output get-pip.py
sudo python2 get-pip.py

Спасибо за Ваши труды, продолжайте в том духи! Приятно читать статьи!