Страницы

rTorrent Notifications via Asterisk

Torrent-качалка на моём домашнем headless Debian исправно качает торренты, но захотелось мне оповещений о том, что торрент скачан. И не хотелось как раньше заходить на SMB или DLNA шару, а хотелось, чтобы инициатива исходила от самого rTorrent'а... Приступим :).

Для начала добавим в .rtorrent.rc следующее:
# On completion, call via Asterisk
system.method.set_key = event.download.finished,call_on_complete,"execute=sudo,/home/rtorrent/scripts/asterisk_notification.sh,completed,003,222,F:,$d.get_name="
Теперь по окончании скачивания торрента (event.download.finished) будет выполнен скрипт asterisk_notification.sh с правами супер-пользователя и некоторыми аргументами (рассмотрим позднее):

Далее разрешим пользователю rtorrent запускать скрипт через sudo без запроса пароля. Для этого правим /etc/sudoers и добавляем строки:
Cmnd_Alias      CMDS = /home/rtorrent/scripts/asterisk_notification.sh
rtorrent ALL=NOPASSWD: CMDS

Содержимое скрипта asterisk_notification.sh:
#!/bin/bash
# Script generates Asterisk call-file from a template by changing
# parameters to the passed ones
# Arguments are: $1 - part of the call-file name
#   $2 - extension to call (called number)
#   $3 - Caller ID Number
#   $4 - Caller ID Name prefix (S: or F: for torrent start and finish)
#   $5 - Caller ID Name (torrent name)

# Initialization stage
fn=notification.call                    # Source filename
sd=/home/rtorrent/scripts               # Source directory
dd=/var/spool/asterisk/outgoing/        # Destination directory

sf=$sd/$fn                              # Source file (full path)
tag=`date +"%F_%H-%M-%S.%N"`            # get current date-time-nanoseconds
cf=$sd/torrent_$1_$tag.call             # Copied file (full path)

# Action stage
cp $sf $cf                              # create a copy of Call-file (template)
sed -r -i 's/CHAN-VAR/'"$2"'/' $cf      # Change called number
sed -r -i 's/CID-NUM/'"$3"'/' $cf       # Change callerid number
sed -r -i 's/CID-NAME/'"$4$5"'/' $cf    # Change callerid name
chown asterisk:asterisk $cf             # Prepare ownership for Asterisk
mv $cf $dd                              # Move Call-file to call directory
Данный скрипт создаёт копию шаблона (notification.call), заменяет параметры Called Number, Caller ID и перемещает в каталог, чтобы Asterisk обработал данный файл и совершил оповещающий звонок.

Содержимое шаблона notification.call:
Channel: SIP/CHAN-VAR
Callerid: CID-NAME <CID-NUM>
Context: rtorrent-notification
WaitTime: 1
MaxRetries: 0
Extension: 0
Т.е. выполняем 1 звонок длиной в 1 секунду из контекста rtorrent-notification.

Содержимое extensions.conf (пока предлагаю просто смотреть на CallerID, так что кладём трубку):
[rtorrent-notification]
exten => s,1,Answer()
exten => s,n,Wait(1)
exten => s,n,Hangup()

Что имеем в итоге: по окончании загрузки торрента rTorrent запускает скрипт, который генерирует оповещалку с необходимыми параметрами и передаёт Asterisk'у для того, чтобы он позвонил на нужный номер и с помощь Caller ID вида "F:Name_of_Torrent_File <222>" сообщил, что скачивание торрента Name_of_Torrent_File завершено (об этом говорит префикс F:, т.е. Finished:, и номер 222).

А добавив в .rtorrent.rc ещё одну строчку:
# On completion, call via Asterisk
system.method.set_key = event.download.finished,call_on_complete,"execute=sudo,/home/rtorrent/scripts/asterisk_notification.sh,completed,003,222,F:,$d.get_name="
# On new torrent insertion, call via Asterisk
system.method.set_key = event.download.inserted_new,call_on_insert_new,"execute=sudo,/home/rtorrent/scripts/asterisk_notification.sh,inserted_new,003,111,S:,$d.get_name="
Будем дополнительно получать уведомления о том, что торрент поставлен на скачивание (event.download.inserted_new). Уведомление будет приходить с префиксом S: и с номера 111. По сути это ещё и уведомление о том, что rTorrent и Asterisk функционируют в штатном режиме :).

Чем мне импонирует Asterisk, так это возможностями, ограниченными только воображением :). Я уже описывал реализацию получения прогноза погоды с помощью Asterisk, в планах описать и то, как мне стало лень названивать самому и теперь Asterisk сам звонит мне в том случае, если завтра будут осадки или температура выйдет за указанные пределы :).

Несколько ссылок:

rTorrent_XMLRPC_reference
Howto: Use rtorrent like a pro

Комментариев нет:

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