Как известно, transmission имеет функцию «альтернативная скорость» и запуск ее по расписанию. По началу меня это устраивало, но все-таки можно же качать не только ночью по полной, но и все то время, когда никто не пользуется интернетом.
Изменяем скорость через файл конфигурации
По-началу все мои мысли пали на файл конфигурации transmission
/etc/transmission-daemon/settings.json
Необходимо учитывать, что все изменения в этом файле вступят в силу только, если сначала остановить работу треккера
/etc/init.d/transmission-daemon stop
внести изменения и запустить
/etc/init.d/transmission-daemon stop
Параметры, которые меня интересовали были:
speed-limit-down
speed-limit-up
Ограничение скорости закачки и отдачи соответственно.
Значения этих параметров необходимо изменить в зависимости есть ли кто-нибудь сейчас в сети.
Есть кто в сети?
Для определения наличия кого-либо в сети я воспользовался обычным пингом. Так как все устройства (ПК, ноутбук, моб. телефон) подключаются к роутеру с DHCP, то IP адреса устройствам присваиваются последовательно, а значит перебирать будем с помощью цикла.
Так родился скрипт версии 1.0
#!/bin/bash #v1.0 #локальный адрес ip=192.168.1. #количество возможных машин в сети n=3 #с какого адреса начинать пинговать машины i0=2 i=$i0 #ограничение скорости. 0 - никого нет в сети, скорость на максимум; 1- есть кто-то в сети, скорость ограничена speedlimit=0 #скорость на отдачу и прием, если никого нет upspeed=50 downspeed=500 #скорость на отдачу и прием, если кто-то есть в сети upspeedlim=10 downspeedlim=10 let end=n+i result=0 #бесконечный цикл while [ 1 = 1 ]; do #цикл пинга локальных машин от i до последней машины end until [ "$i" -eq "$end" ];do result=$(ping -c 1 $ip$i | tail -2 | head -1 | awk '{print $4}') #если в результате пинга кто-то был обнаружен, то цикл останавливается и .. см. if if [ "$result" = 1 ]; then break fi let i++ done #если результат пинга=1 (кто-то в сети) и в то же время ограничение на скорость не стоит, то включаем его #иначе, если результат пинга=0 (нет никого) и в то же время ограничение на скорость стоит, то выключаем его if [ "$result" = 1 ]; then if [ $speedlimit = 0 ]; then sudo /etc/init.d/transmission-daemon stop #изменяем скорость закачки sudo perl -pi~ -e 's/"speed-limit-down":(.+)/"speed-limit-down": '$downspeedlim',/' /etc/transmission-daemon/settings.json #изменяем скорость отдачи sudo perl -pi~ -e 's/"speed-limit-up":(.+)/"speed-limit-up": '$upspeedlim',/' /etc/transmission-daemon/settings.json sudo /etc/init.d/transmission-daemon start speedlimit=1 fi fi if [ "$result" = 0 ]; then if [ $speedlimit = 1 ]; then sudo /etc/init.d/transmission-daemon stop #изменяем скорость закачки sudo perl -pi~ -e 's/"speed-limit-down":(.+)/"speed-limit-down": '$downspeed',/' /etc/transmission-daemon/settings.json #изменяем скорость отдачи sudo perl -pi~ -e 's/"speed-limit-up":(.+)/"speed-limit-up": '$upspeed',/' /etc/transmission-daemon/settings.json sudo /etc/init.d/transmission-daemon start speedlimit=0 fi fi #задержка 30 секунд sleep 30 i=$i0 done
Он конечно не супер, но работает.
Совершенствуемся дальше
Дальше я начал рассуждать о том, что перезагружать треккер как-то уныло, веб интерфейс ведь все это делает без перезагрузок, а чем я, собственно, хуже.
Благодаря товарищу andbas было выбрано направление в сторону утилиты transmission-remote. Расписывать и хвалить ее не буду, вкратце скажу, что с ее помощью подключаясь к веб-интерфейсу можно управлять треккером. Единственным минусом я бы назвал то, что в скрипте приходится в явном виде указывать логин и пароль, хотя это, возможно, можно изменить.
Для некоторого упрощения я решил использовать функцию «альтернативная скорость» или далее по тексту «черепашка», потому что в веб-интерфейсе иконка изображена как раз в виде черепашки и интуитивно намекает что с ее помощью мы будем «тормозить».
Значит так, если кто-то есть в сети, то включаем черепашку, нет — выключаем. Если мы в сети и хотим принудительно включить закачку на полную, то делается достаточно просто — клик по черепашке, вместо входа в настройки и изменения скорости.
Перерождение, скрипт версии 1.1
#!/bin/bash #ver.1.1 #transmission ip:port tip=192.168.1.100:9091 #login login=* #password password=* #локальный адрес ip=192.168.1. #количество возможных машин в сети n=3 #с какого адреса начинать пинговать машины i0=2 i=$i0 let end=n+i result=0 #флаг однократного выполнения при старте start=1 #флаг ограничения скорости speedlimit=0 #бесконечный цикл while [ 1 = 1 ]; do #цикл пинга локальных машин от i до последней машины end until [ "$i" -eq "$end" ];do result=$(ping -c 1 $ip$i | tail -2 | head -1 | awk '{print $4}') #если в результате пинга кто-то был обнаружен, то цикл останавливается и .. см. if if [ "$result" = 1 ]; then break fi let i=$i+1 done #если результат пинга=1 (кто-то в сети) и в то же время ограничение на скорость не стоит, то включаем его #иначе, если результат пинга=0 (нет никого) и в то же время ограничение на скорость стоит, то выключаем его if [ "$result" = 1 ]; then if [ $start = 1 ]; then #однократно при старте #устанавливаем черепашку, устанавливаем флаг ограничения скорости transmission-remote $tip -n $login:$password -as speedlimit=1 start=0 else if [ $speedlimit = 0 ]; then #устанавливаем черепашку, устанавливаем флаг ограничения transmission-remote $tip -n $login:$password -as speedlimit=1 fi fi fi if [ "$result" = 0 ]; then if [ $start = 1 ]; then #однократно при старте #сбрасываем черепашку, сбрасываем флаг ограничения скорости transmission-remote $tip -n $login:$password -AS speedlimit=0 start=0 else if [ $speedlimit = 1 ]; then #сбрасываем черепашку, сбрасываем флаг ограничения transmission-remote $tip -n $login:$password -AS speedlimit=0 fi fi fi #задержка 30 секунд sleep 30 i=$i0 done
Опять двадцать пять. Когда кто-то в сети — качаем медленно, канал не забиваем, никому не мешаем, но винчестер то работает: греется, потребляет энергию. С моими настройками (10кб/с закачка на черепашке) это выглядит не совсем экономично, уж лучше пусть ничего не качается вовсе и винчестер не гудит.
Ставлю точку (возможно временно), скрипт версии 1.2
#!/bin/bash #v1.2 #transmission ip:port tip=192.168.1.100:9091 #login login=login #password password=pass #локальный адрес ip=192.168.1. #количество возможных машин в сети n=3 #с какого адреса начинать пинговать машины i0=2 i=$i0 let end=n+i result=0 #флаг однократного выполнения при старте start=1 #флаг ограничения скорости speedlimit=0 #бесконечный цикл while [ 1 = 1 ]; do #цикл пинга локальных машин от i до последней машины end until [ "$i" -eq "$end" ];do result=$(ping -c 1 $ip$i | tail -2 | head -1 | awk '{print $4}') #если в результате пинга кто-то был обнаружен, то цикл останавливается и см далее if [ "$result" = 1 ]; then break fi let i++ done #если результат пинга=1 (кто-то в сети) и в то же время ограничение на скорость не стоит, то включаем его #иначе, если результат пинга=0 (нет никого) и в то же время ограничение на скорость стоит, то выключаем его if [ "$result" = 1 ]; then if [ $start = 1 ]; then #однократно при старте #останавливаем все треки, устанавливаем флаг ограничения скорости transmission-remote $tip -n $login:$password -t all -S speedlimit=1 #сбрасываем флаг однократного выполнения start=0 else if [ $speedlimit = 0 ]; then #останавливаем все треки, устанавливаем флаг ограничения скорости transmission-remote $tip -n $login:$password -t all -S speedlimit=1 fi fi fi if [ "$result" = 0 ]; then if [ $start = 1 ]; then #однократно при старте #запускаем все треки, сбрасываем флаг ограничения скорости transmission-remote $tip -n $login:$password -t all -s speedlimit=0 #сбрасываем флаг однократного выполнения start=0 else if [ $speedlimit = 1 ]; then #запускаем все треки, сбрасываем флаг ограничения скорости transmission-remote $tip -n $login:$password -t all -s speedlimit=0 fi fi fi #задержка 30 секунд sleep 30 i=$i0 done
Теперь вроде бы все устраивает…
Напоследок автозагрузка скрипта
Совсем забыл, ведь скрипт должен стартовать вместе с системой. Поэтому было решено сделать демон.
#! /bin/sh ### BEGIN INIT INFO # Provides: tsl # Required-Start: $remote_fs $syslog $all # Required-Stop: $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Example initscript # Description: This file should be used to construct scripts to be # placed in /etc/init.d. ### END INIT INFO case "$1" in start) start-stop-daemon -Sbvx /usr/bin/tsl ;; stop) sudo pkill tsl ;; *) echo "Usage: /etc/init.d/tsl-deamon {start|stop}" ;; esac :
Для начинающих линуксоидов: скрипт необходимо сделать запускающимся
sudo chmod +x <bash_script_name>
и положить в папку usr/bin
Демон положить в etc/ini.d и для автозапуска прописать
update-rc.d <daemon_name> defaults
для удаления из автозагрузки
update-rc.d -f <daemon_name> remove
*в моем случае имя скрипта tsl (transmission speed limiter), если собираетесь его менять, то и в демоне также необходимо поменять
Эпилог
Все описано не детально, это и так понятно. Также должны быть ошибки, недочеты и прочее. Сам я начинающий линуксоид (спасибо малине за это), поэтому в некоторых местах возможны глупости…
А в общем, думаю, идея ясна. На базе данного шаблона можно сделать двух, трех… позиционное регулирование скорости закачки/откачки, в зависимости от количества пользователей в сети например (если 1 юзер — одна скорость, 2 — другая и т.д.). Также если у нас айпи идет не по порядку, то можно использовать массив из адресов и в цикле перебирать элементы массива.
ссылка на оригинал статьи http://habrahabr.ru/post/166821/
Добавить комментарий