среда, 23 октября 2013 г.

Установка парктроника СПАРК в моего енота.

Наконец решился на установку, подаренного на день рождения, парктроника - СПАРК хх. В помощь был взят один из разработчиков этого полезного устройства. Всё таки он чаще устанавливает своё творение , а я только второй раз. И то, в первый раз я практически только наблюдал со стороны за процессом. Откровенно говоря, меня волновала только врезка датчиков. С остальным я бы справился сам. И справился.
Специалисты сделали бы это быстро  <тут можно вставить про установку за 2 часа> , а у меня вся процедура растянулась на два вечера. В первый вечер я протянул проводку от индикатора до багажника. Во второй вечер, мы уже вдвоем врезали датчики и подключились к проводке.
К сожалению, вначале картинок не будет. Ну забыл я, что весь процесс нужно фотографировать. Да фотоаппарат я тоже забыл, поэтому снимал на телефон.
Индикатор парктроника я решил приклеить на верхнюю грань зеркала заднего вида. Проводку от индикатора к блоку парктроника провел с левой стороне по низу.
Итак.
Снимаем резинку с дверного проема водителя. Снимать её нужно сверху, спереди, снизу и до середины задней части. Наверно можно снять всю, но лично я не стал снимать. Далее откручиваем солнцезащитный козырек со стороны водителя и с помощью отвертки выворачиваем "крючок" солнцезащитного козырька (как это делать - есть в книге про енота). Тут меня поймала первая проблема. То ли отвертка у меня не правильная, то ли ещё что, но этот "крючок" я немного сломал :-( .В принципе назад я его поставил и держится он достаточно туго, но тем не менее, такая проблема меня настигла. Тут же можно снять "крючок" и пассажирского козырька, чтобы проще было подлазить под обивку крыши. Далее подсовываем отвертку под плафон освещения и аккуратно снимаем "стекло". Теперь отжимаем защелку с правой стороны плафона и вытаскиваем его. Больше здесь я ни чего не разбирал. Протянул провод от индикатора под обивкой потолка, и даже прикрепил его кабелю антенны.






Сделал полочку

Из обрезков шпона с муссорки местной мебельной фабрики и фанеры сделал полочку.
Это была моя первая попытка клеить шпон.
Фотографии распиловки фанеры нет. Но там всё достаточно просто.
1. Сделал чертеж.
2. С помощью дисковой пилы и самодельной шины напилил заготовки из 15мм фанеры.
3. Наклеил шпон на контактный клей (использовал Момент №1)
4. Заднюю стенку сделал с рисунком.
5. Покрыл лаком в 3 слоя.
6. Склеил на ПВА и шканты.

Несколько фоток.

Рубашку на заднюю стенку собирал на обычный малярный скотч
Задняя стенка готова.
Применил такой лак. Детали покрывал лаком по отдельности. Места будущей склейки защитил малярным скотчем.
Собрал боковые стенки.
Собрал окончательно.


Финальная фотка. Полочка на своём месте.

воскресенье, 31 января 2010 г.

Настройка раздачи интернета через bluetooth и не только.

Захотелось мне использовать свой телефон SE k750i в качестве пульта управления. Чтобы можно было слушать радио на роутере и рулить этим процессом не включая ББ. Ну это пока в будущем, а на данный момент я настроил доступ к роутеру и в инет с телефона с помощью bluetooth.
О том, как я это сделал и посвящена эта заметка.

В наличии у меня был телефон SE k750i и два брелка (Gembird BTD-002 и Defender (модель не знаю)).

Оба брелка, до этого работали в ББ и прекрасно справлялись со своей работой. Лично мне было интересно, заработают ли они в моем роутере (Asus wl-500gP). Сразу скажу, что оба брелка заработали.

При настройке я пользовался Gembird'ом, а потом поставил Defender. Gembird же вернулся на свое место в ББ. Прежде, чем перейти к подробному описанию всего процесса, ещё несколько фотографий брелка:

Ну а теперь к делу.
Но прежде, не большое, но важное замечание. Судя по сообщениям с форума wl500g.info роутер не любит работать с USB 1.1 устройствами через USB-HUB 2.0. Поэтому рекомендуется USB 1.1 брелки подключать непосредственно в роутер, либо через USB-HUB 1.1. Ну или можно поискать USB 2.0 брелок, вполне возможно, что он заработает через USB-HUB 2.0, но гарантировать это я не буду, потому как не проверял.
Лично у меня таких проблем не возникло, потому как мой роутер проапгрейжен по полной программе: ОЗУ: 128 Мб плюс 2+2 USB-порта и ещё COM-порт в запасе. Кроме того, роутер прошит прошивкой от энтузиастов на данный момент времени 1.9.2.7-d-r740 хотя есть свежие прошивки.

1. Для работы будет использоваться комплект утилит bluez. Но как выяснилось  не все версии bluez одинаково полезны. Нужно ставить именно те, что указываю я:
bluez-hcidump_1.40-1_mipsel.ipk
bluez-libs_3.17-1_mipsel.ipk
bluez-utils_3.17-1_mipsel.ipk
dbus_1.1.1-3_mipsel.ipk

Их можно найти на форуме  wl500g.info
Находим указанные версии утилит и скачиваем их например в /opt/temp
Если другие версии этих утилит ещё не ставились, то ставим их так:
ipkg install /opt/temp/dbus_1.1.1-3_mipsel.ipk
ipkg install /opt/temp/bluez-libs_3.17-1_mipsel.ipk
ipkg install /opt/temp/bluez-utils_3.17-1_mipsel.ipk
ipkg install /opt/temp/bluez-hcidump_1.40-1_mipsel.ipk

 Если же, Вы уже пытались ставить другие(свежие) версии, то указываем ключ для установки более старых версий программ:
ipkg install -force-downgrade /opt/temp/dbus_1.1.1-3_mipsel.ipk
ipkg install -force-downgrade /opt/temp/bluez-libs_3.17-1_mipsel.ipk
ipkg install -force-downgrade /opt/temp/bluez-utils_3.17-1_mipsel.ipk
ipkg install -force-downgrade /opt/temp/bluez-hcidump_1.40-1_mipsel.ipk


2. Исправляем конфигурационные файлы, в качестве пользователя для запуска указываем admin:
/opt/etc/dbus-1/system.conf 
<!-- Run as special user -->
<user>admin</user>

 

/opt/etc/dbus-1/system.d/bluetooth.conf 
  <policy user="admin"> 

/opt/etc/bluetooth/hcid.conf  приводим к следующему виду:
## HCI daemon configuration file.
#

# HCId options
options {

  # Automatically initialize new devices
  autoinit yes;

  # Security Manager mode
  # none - Security manager disabled
  # auto - Use local PIN for incoming connections
  # user - Always ask user for a PIN
  #
  security auto;

  # Pairing mode
  # none - Pairing disabled
  # multi - Allow pairing with already paired devices
  # once - Pair once and deny successive attempts
  pairing multi;

  # Default PIN code for incoming connections
  passkey "456789";

}

# Default settings for HCI devices
device {

  # Local device name
  # %d - device id
  # %h - host name
  name "BlueZ (%h)";

  # Local device class
  class 0x000100;

  # Default packet type
  #pkt_type DH1,DM1,HV1;

  # Inquiry and Page scan
  iscan enable; pscan enable;

  # Default link mode
  # none - no specific policy
  # accept - always accept incoming connections
  # master - become master on incoming connections,
  # deny role switch on outgoing connections
  lm accept,master;

  # Default link policy
  # none - no specific policy
  # rswitch - allow role switch
  # hold - allow hold mode
  # sniff - allow sniff mode
  # park - allow park mode
  lp rswitch,hold,sniff,park;
}

 т.е. меняется:
   security auto; - чтобы можно подключаться при помощи ПИНа.
   passkey "456789"; - указываем сам ПИН.
   name "BlueZ (%h)"; - указываем имя, под которым будет виден наш роутер в bluetooth сети. Можно указать своё имя.
 class 0x000100; - Я не менял, но мне попадалась рекомендация установить значение 0x020100 - «Класс службы: Сеть» и «Класс устройства: Компьютер, без категории». Но у меня и со значением по умолчанию всё работает.
  lm accept,master; - добавляем ",master" если не было.

3. Скачиваем дополнительные модули. Модули нужно брать для своей прошивки. Лично я взял со странички с прошивкой от энтузиастов версию для своей прошивки modules-1.9.2.7-d-r740.tgz
Распаковываем все или только нужные модули.
Лично я распаковал все модули в каталог: /opt/lib/modules в результате у меня появился каталог 2.4.37.6 содержаший все доступные модули для моей прошивки.
Если нет желания/возможности распаковать все модули, то можно взять только нужные, а именно:
bluez.o
bnep.o
crc32.o
hci_usb.o
l2cap.o
rfcomm.o
sco.o

 

Создаем скрипт-загрузчик модулей /opt/etc/bluetooth/loadmodules следующего содержания:
#!/bin/sh

modprobe crc32
modprobe bluez
modprobe hci_usb
modprobe l2cap
#modprobe rfcomm  этот модуль мне не нужен
modprobe bnep
#modprobe sco модуль для передачи звука через bluetooth мне тоже пока не нужен

 
Модули, которые мне не нужны я закомментарил. Если Вы распаковали модули в место отличное от /opt/lib/modules, то нужно указать полные пути к загружаемым модулям.

Вызов скрипта-загрузчика вставляем в post-mount:
. . . 
# грузим модули для работы с bluetooth
/opt/etc/bluetooth/loadmodules
. . .

После изменения post-mount, не забываем сделать
flashfs save && flashfs commit && flashfs enable
Чтобы изменения в post-mount не потерялись после перегрузки. 

4. Приводим в порядок файл запуска DBus - /opt/etc/init.d/S20dbus
Во-первых он должен быть исполняемым. Во-вторых убираем (или комментируем) из него проверку существования пользователя messagebus. И в-третьих меняем пользователя, под которым будет работать демон DBus. Вот содержимое моего скрипта запуска DBus:
#!/bin/sh
#OPTWARE_TARGET=ddwrt
# -*- coding: utf-8 -*-
# Debian init.d script for D-BUS
# Copyright Вc 2003 Colin Walters <walters@debian.org>

PATH=/sbin:/bin:/usr/bin:/usr/sbin:/opt/bin:/opt/sbin

set -e

DAEMON=/opt/bin/dbus-daemon
NAME=dbus
DAEMONUSER=admin
PIDDIR=/opt/var/run/dbus
PIDFILE=$PIDDIR/pid
DESC="system message bus"

test -x $DAEMON || exit 0

# Source defaults file; edit that file to configure this script.
ENABLED=1
PARAMS=""
if [ -e /opt/etc/default/dbus ]; then
   . /opt/etc/default/dbus
fi

test "$ENABLED" != "0" || exit 0

start_it_up()
{
   if [ ! -d $PIDDIR ]; then
     mkdir -p $PIDDIR
     chown $DAEMONUSER $PIDDIR
     chgrp $DAEMONUSER $PIDDIR
   fi
   if [ -e $PIDFILE ]; then
     echo "$DESC already started; not starting."
   else
     echo -n "Starting $DESC: "
     ${DAEMON} --system $PARAMS
     echo "$NAME."
   fi
}

shut_it_down()
{
   echo -n "Stopping $DESC: "
   if [ -e $PIDFILE ]; then
     kill `cat $PIDFILE`
   else
     killall ${DAEMON}
   fi
   echo "$NAME."
   rm -f $PIDFILE
}

case "$1" in
   start)
     start_it_up
     ;;
   stop)
     shut_it_down
     ;;
   restart|force-reload)
     shut_it_down
     sleep 1
     start_it_up
     ;;
   *)
     echo "Usage: /opt/etc/init.d/$NAME {start|stop|restart|force-reload}" >&2
     exit 1
     ;;
esac

exit 0

Файл конфигурации DBus, лежащий по пути /opt/etc/default/dbus я не менял. 

5. Приводим в порядок файл запуска демона hci /opt/etc/init.d/bluetooth
Во-первых переименовываем его в S40bluetooth и делаем исполняемым. Во-вторых добавляем в переменную PATH пути для /opt/bin и /opt/sbin. А в-третьих можно добавить вариант работы скрипта для режима restart. После этих доработок, мой скрипт выглядит так:
#!/bin/sh

#
# Start/stop the Bluetooth daemons
#

set -e

PATH=/sbin:/bin:/usr/sbin:/usr/bin:/opt/sbin:/opt/bin
NAME=bluetooth
DESC="Bluetooth subsystem"

DAEMON_NAME=hcid
HID2HCI_NAME=hid2hci

DAEMON_EXEC="`which $DAEMON_NAME || true`"
HID2HCI_EXEC="`which $HID2HCI_NAME || true`"

DAEMON_ENABLE=true
HID2HCI_ENABLE=false

DAEMON_CONFIG="/opt/etc/bluetooth/hcid.conf"

[ -e /etc/default/bluetooth ] && . /etc/default/bluetooth

case "$1" in
   start)
     echo -n "Starting $DESC:"
     if $DAEMON_ENABLE && [ -x "$DAEMON_EXEC" ] && [ -f "$DAEMON_CONFIG" ] ; then
        $DAEMON_EXEC -s -f $DAEMON_CONFIG
        echo -n " $DAEMON_NAME"
     fi
     if $HID2HCI_ENABLE && [ -x "$HID2HCI_EXEC" ] ; then
        $HID2HCI_EXEC --tohci > /dev/null 2>&1 || true
        echo -n " $HID2HCI_NAME"
     fi
     echo "."
     ;;
   stop)
     echo -n "Stopping $DESC:"
     killall $DAEMON_NAME > /dev/null 2>&1 || true
     echo -n " $DAEMON_NAME"
     echo "."
     ;;
   restart)
     echo -n "Stopping $DESC:"
     killall $DAEMON_NAME > /dev/null 2>&1 || true
     echo -n " $DAEMON_NAME"
     echo "."

     echo -n "Starting $DESC:"
     if $DAEMON_ENABLE && [ -x "$DAEMON_EXEC" ] && [ -f "$DAEMON_CONFIG" ] ; then
       $DAEMON_EXEC -s -f $DAEMON_CONFIG
       echo -n " $DAEMON_NAME"
     fi
     if $HID2HCI_ENABLE && [ -x "$HID2HCI_EXEC" ] ; then
       $HID2HCI_EXEC --tohci > /dev/null 2>&1 || true
       echo -n " $HID2HCI_NAME"
     fi
     echo "."
     ;;
   *)
     N=/etc/init.d/$NAME
     echo "Usage: $N {start|stop|restart}" >&2
     exit 1
     ;;
esac

exit 0



Чтобы работал этот скрипт нужно поставить утилиту which. Для этого делаем:
ipkg install which 
  

Можно отредактировать файл конфигурации hci, который лежит в /opt/etc/default/bluetooth. Что не запускалась служба HID можно изменить значение HID2HCI_ENABLE=false
 
6. Создаем скрипт для запуска службы pand, которая будет принимать запросы от bluetooth устройств и поднимать связь с ними. Скрипт я назвал /opt/etc/init.d/S85mybt 
#!/bin/sh

NAME="MyBluetooth"

start() {
   echo "Starting $NAME... "
   /opt/bin/pand --listen --master --role NAP --devup /opt/etc/bluetooth/dev-up --devdown /opt/etc/bluetooth/dev-down
}

stop() {
   echo "Shutting down $NAME... "
   killall pand
}

case "$1" in
   start)
     start
     ;;
   stop)
     stop
     ;;
   restart)
     stop
     sleep 1
     start
     ;;
   *)
     echo "Usage: $0 (start|stop|restart)"
     exit 1
     ;;
esac
exit
0


Не забываем сделать его исполняемым.
Создаем скрипт который будет отрабатываться при поднятии соединения с bluetooth устройством /opt/etc/bluetooth/dev-up
#!/bin/sh

# $1 = имени интерфеса и равен bnep0 или точнее bnepx
# $2 = MAC подключающегося устройства
/usr/bin/logger -t $(basename $0) "started [$@]"

# файл, с разрешенными MAC
FILTER_MAC=/opt/etc/bluetooth/filter_mac
TESTS_MAC=$2

# проверяем наличие файла с разрешенными MAC
if [ -e $FILTER_MAC ]
then
   REZ="`cat $FILTER_MAC | grep -i $TESTS_MAC`"
   if [ -n "$REZ" ]
   then
   # разрешенный MAC, пускаем его в нашу сеть
   # /usr/bin/logger -t $(basename $0) "Good MAC [$@]"
     ifconfig $1 0.0.0.0
     brctl addif br0 $1
   else
     /usr/bin/logger -t $(basename $0) "The attention, forbidden MAC [$@]"
   fi
else
   # /usr/bin/logger -t $(basename $0) "Don't test MAC [$@]"
   ifconfig $1 0.0.0.0
   brctl addif br0 $1
fi

Делаем его исполняемым.

Создаем скрипт, который будет выполняться после разрыва соединения /opt/etc/bluetooth/dev-down 
#!/bin/sh
# $1 = имени интерфеса и равен bnep0 или точнее bnepx

/usr/bin/logger -t $(basename $0) "stoped [$@]"

Делаем его исполняемым. 

В принципе этот скрипт не особо нужен, поскольку ни чего полезного он не делает.
 

Можно ограничить доступ в вашу локальную сеть по MAC'у устройства с которого пытаются подключиться. Для этого нужно создать файл /opt/etc/bluetooth/filter_mac и заполнить его значениями MAC ваших устройств. Например так:
00:1B:59:53:4A:2C 
00:1B:59:53:7A:1C
Подсмотреть MAC, подключающегося устройства можно в System Log.
Там будут появляться строки примерно такого вида

19:04:17 31-01-2010 (notice|user|dev-up) dev-up: started [bnep0 00:1B:59:53:4A:2C]

Если же, ограничивать доступ по MAC Вы не собираетесь, то файл filter_mac создавать не нужно, а если уже создали, то удалите его.

7. В принципе, после этого можно вставить USB-Bluetooth брелок в роутер и перегрузиться. После загрузки можно пытаться подключаться.

8. Не обязательно, но лучше сделать. Была замечена неприятная особенность. При подключении/отключении происходит временное подвисание локальной сети за роутером. Связано это с перенастройкой бриджа(br0) при включении/исключении интерфейса bnep0,bnep1,... в/из бридж(а), при котором происходит изменение MAC br0 на MAC bnep0. Поскольку изменить MAC bnep0 на MAC br0, перед включением в бридж неполучалось, то осталось сделать наоборот, т.е. при загрузке роутера менять MAC br0 на MAC bluetooth брелка. Изменить MAC br0 можно как минимум двумя способами:
 1 - Менять MAC при загрузке роутера, например в скрипте post-boot или pre-boot;
 2 - Поменять MAC для интерфейса vlan0 в nvram.
Я выбрал первый вариант.
Для этого в скрипт post-boot я добавил следующие строки:

ifconfig vlan0 down
ifconfig vlan0 hw ether 00:11:67:5В:A9:75 <- MAC брелка (поменять на свой)
ifconfig vlan0 up

И сделал
flashfs save && flashfs commit && flashfs enable 
чтобы сохранить изменения. 

Для реализации второго варианта по идее нужно выполнить такую команду:
nvram set et0macaddr=00:11:67:5В:A9:75  <- MAC брелка (поменять на свой)
Но этот вариант я не проверял.
 

Узнать MAC брелка, можно вызвав ifconfig после установления связи:
ifconfig
bnep0 Link encap:Ethernet HWaddr 00:11:67:5В:A9:75
<- это MAC брелка
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:110 errors:0 dropped:0 overruns:0 frame:0
TX packets:352 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:7393 (7.2 KiB) TX bytes:263934 (257.7 KiB)

. . . 
 

Из замеченых минусов первого варианта. На мой взгляд, роутер стал грузиться дольше. Но я считаю, что это не существенный минус, поскольку я перегружаю роутер очень редко. До настройки bluetooth он у меня работал без перегрузки месяца два, а то и больше.

Собственно, по настройке роутера - это всё.

Что касается телефона. То там всё просто, хотя может и не очевидно.

Напоминаю, что у меня телефон SE k750i.

После того, как телефон спарился и соединился с роутером, в 

Меню->Параметры->Связь->Передача данных->Уч.записи данных  
появилась запись "BlueZ (IG...)"
 


 Потом идем в Меню->Параметры->Связь->Парам. Интернет->Параметры Java
и создаем профиль BT
 В качестве записи данных (подключ. через) в этом профиле задаем "BlueZ (IG...)"


 После этого можно использовать инет например в Opere:
 На этом пока все!!!

понедельник, 5 октября 2009 г.

Железная прокачка роутера ASUS wl-500gP

На выходных, а точнее 5 октября 2009 года, с другом провели железный upgrate роутера. Поскольку, профессия и работа друга неразрывно связана с пайкой электронных компонент, я полностью доверился его знаниям, опыту и рукам. И не ошибся. Вся работа по отпайке и припайке микросхем и всего остального была сделана на высшем уровне. А сделано было следующие:
1. Перепаяна память. Было 32 Мб, а стало 128 Мб.
2. Припаян двойной USB-разъем и разведены 2 USB порта.
3. Распаяна колодка для COM-порта и консоли.

Все операции производились в соответствии с руководством к действию.
Самые большие проблемы возникли с отпайкой старой памяти и распайкой колодки для COM-порта. Точнее это были не проблемы, а просто процедура отпайки заняла "очень" много времени. Я точно не засекал, ну наверно по минут 15 на микросхему. Причиной столь затянувшейся отпайки старых микросхем был тугоплавкий безсвинцовый припой, который использовался при пайке роутера.
При отпайке мы поступали следующим образом. Вначале, с помощью паяльника на ножки, с одной стороны микросхемы наносился обыкновенный припой, а потом эта сторона равномерно прогревалась феном при температуре 350 градусов. С одного края, микросхема поддевалась маленькой отверткой. Постепенно, без применения излишних усилий, вся сторона микросхемы отпаивалась и поднималась. Со второй стороной микросхемы поступали также, за исключением, того, что теперь микросхема поднималась не отверткой, а пинцетом.
Что касается колодки, то там очень долго пришлось греть отверстие для ПТВ-контакта, причем грели с двух сторон, с одной феном, с другой паяльником. С остальными контактами было попроще - хватило паяльника.

Все процедуры, по реализации данного апгрейта очень подробно священы на этом форуме.

Теперь фотографии.


 рис. 1. Планка DDR памяти на 512 Мб, послужившая донором и старые микросхемы памяти.
(при перепайке использованы микросхемы Hynix HY5DU121622CTP-D43. Планка б/у, куплена за 500р. Старые микросхемы имеют следующую маркировку: W9412G6CH-5.)



рис. 2. Плата роутера снизу.
(С нижней стороны запаян только резистор R43 в адресную линию A12.)



рис. 3. Этот самый резистор, только крупнее.
(22 Ом - взят с какой-то материнской платы. Немного крупнее, чем остальные, но встал нормально.) 



 
рис. 4. Плата роутера сверху, после всех модификаций.
(Здесь можно увидеть запаянную память (справа внизу), USB-разъем (сверху, между WAN и LAN разъемами), проводки идущие от USB-разъема к контролеру VIA VT6212L и колодку COM-порта и консоли (справа, над микросхемами памяти).)


 
рис. 5. Распаянная память.
(Конденсатор на 51 ногу не припаивали, вроде работает без ошибок, даже 300МГц.)


 
рис. 6. Распаянный USB-разъем.
(Разъем припаян снизу к самой плате и усиками к соседним WAN и LAN разъемам. Подтягивающие резисторы распаяны к ножкам USB-разъема. Питание взято от разъема питания роутера. Земля припаяна к соседнему WAN-разъему.)


 
рис. 7.  USB-контроллер, с подпаянными проводками.
(Эти проводки нужно бы закрепить клеем, чтобы не болтались.) 


 
рис. 8. Новый вид задней панели.
(Вырезано окошко под дополнительные USB-разъемы.) 




Кроме этого, был произведен upgrate световодов. На световоды был одет толстый, непрозрачный кембрик, с выпуском над световодом на 2-3 мм, так чтобы при сборке роутера кембрик упирался в плату роутера. Благодаря этому моду теперь роутер не сверкает как новогодняя елка.

Вот собственно и все.

вторник, 15 сентября 2009 г.

Скрипт управления скоростью скачивания/отдачи rTorrent на роутере ASUS wl-500gP в зависимости от трафика от других компьютеров за роутером

В общем-то, я планировал выкладывать сюда заметки о том, как я настраивал роутер с самого начала, но что-то нет времени или желания, или того и другого вместе. Поэтому описание, того, что сделано на настоящий момент оставлю на потом. А сейчас опишу последнее своё творение. К тому же это самый большой и сложный скрипт написанный мной на shell на данный момент времени (все таки, по долгу службы я занимаюсь 1С, а не роутерами, линуксом и программированием на shell ;-)).
Значит так. Предполагается, что роутер (ASUS wl-500gP или совместимый) уже прошит олеговской прошивкой и проведена начальная настройка до rTorrent. Кроме того, должны стоять следующие утилиты: tail, head, awk, wget. Если чего из этого нет, то отправляемся на wl500g.info и настраиваем все, что нужно. Кроме того, понадобится утилита sudo, для того, чтобы скрипт смог работать под пользователем p2p, от имени которого стартует rTorrent

Sudo
У меня rTorrent работает от имени пользователя p2p. Поскольку этот пользователь бесправный, то он не сможет запускать этот скрипт. Точнее скрипт он запустит, а вот обратиться к iptables - не сможет. Для того чтобы обойти эту неприятность и ставится sudo. Ставим:

ipkg install sudo

После установки, находим конфиг sudo (/opt/etc/sudoers) и правим его. Самый ПРАВИЛЬНЫЙ способ править конфиг sudo - это использовать утилиту visudo. Дело в том, что перед записью исправленного конфига visudo в начале проверяет его на корректность и если все нормально, то сохраняет его. А если находит ошибки - то не сохраняет. Итак, набираем в консоле:

visudo 

Вот мой конфиг sudo. Строки которые я исправлял, отмечены красным:

# sudoers file.
#
# This file MUST be edited with the 'visudo' command as root.
# Failure to use 'visudo' may result in syntax or file permission errors
# that prevent sudo from running.
#
# See the sudoers man page for the details on how to write a sudoers file.
#

# Host alias specification

# User alias specification

# Cmnd alias specification

# Defaults specification

# Runas alias specification

# User privilege specification
# root ALL=(ALL) ALL
admin ALL=(ALL) ALL

# Uncomment to allow people in group wheel to run all commands
# %wheel ALL=(ALL) ALL
# Same thing without a password
# %wheel ALL=(ALL) NOPASSWD: ALL

# Samples
# %users ALL=/sbin/mount /cdrom,/sbin/umount /cdrom
# %users localhost=/sbin/shutdown -h now

p2p IGORROUTER = (admin) NOPASSWD: /usr/sbin/iptables

Defaults:p2p runas_default = admin
Defaults:admin runas_default = admin

Пользователя root я закомментарил, и добавил пользователя admin, аналогичного root.
Указал, что пользователь p2p может запускать на моем роутере (IGORROUTER) утилиту iptables
без пароля.
Пользователем по умолчанию для p2p назначен admin. Также и для пользователя admin, назначен пользователь admin, иначе sudo пытается использовать пользователя root, которого нет. Узнать имя роутера можно при помощи hostname, например:


hostname
IGORROUTER

Кратко, команды, которые я использовал при правке конфига в visudo:
- клавиша <Insert> - перейти в режим редактирования;
 - клавиша <Esc> - выйти из режима редактирования;
- ":w" - сохранить конфиг;
- ":q" - выйти из visudo;
- ":wq" - сохранить конфиг и выйти из visudo.


Скрипт rt-shaper.sh

Скрипт rt-shaper.sh предназначен для автоматической регилировки скачки/отдачи bittorrent-клиентом rTorrent в зависимости от наличия и количества трафика проходящего через роутер. Другими словами, если форвардного(проходящего через роутер на клиентов в вашей сети) трафика через роутер нет, то rTorrent, установленный на роутер, не ограничивается. Если же форвардный трафик есть, то скорость скачки/отдачи ограничивается. Более того, и скорость скачки, и скорость отдачи изменяется в заданном интервале в зависимости от количества форвардного трафика.

Я рекомендую скрипт ставить в отдельный каталог. У меня он стоит в /opt/etc/rt-shaper

На данный каталог нужно дать права пользователю p2p. У меня в качестве группы для каталога указана p2p и группе даны права на чтение(r), запись(w) и выполнение(x).

Далее, нужно место, где будут храниться значения, которые должны сохраняться между запусками скрипта. Поскольку, при каждом запуске скрипта, туда что-то пишется, лучше это место завести не на флешке, а на винте. У меня винт смонтирован в /home, а на нём я создал подкаталог var и ещё подкаталог rtorrent. Таким образом, путь к временным файлам имеет такой вид: /home/var/rtorrent

На него тоже нужно дать права на запись пользователю p2p.

Скрипт /opt/etc/rt-shaper/rt-shaper.sh

#!/bin/sh
# Скрипт предназначения для автоматического ограничения rTorrent работающего на роутере
# при обнаружении транзитного(форвардного)  трафика через роутер.
# Скорость(скорости upload'а и download'а) может варьироваться в заданном пределе в зависимости от 
# количества и поведения транзитного трафика.
# С точки зрения rTorrent'а скрипт действует писсимистично, т.е.:
#   при присутсвии транзитного трафика rTorrent ограничевается быстрее, 
#   чем это ограничение снимается при уменьшении транзитного трафика или его полном исчезновении
#
# Автор: Игорь (igor77777 on wl500g.info)
#
PATH=/opt/bin:/opt/sbin:/usr/bin:/sbin:/bin:/usr/sbin
RTSHAPER=/opt/etc/rt-shaper
VARCAT=/home/var/rtorrent
LOGFILE=/opt/var/log/rt-shaper.log
PIDUPWGET=$VARCAT/rtshaperupwget.pid
PIDDLWGET=$VARCAT/rtshaperdlwget.pid

# Если есть конфигурационный файл, то подключаем его
min_uprate=10;  # минимальный upload rate rTorrent в килобайтах. Скорость будет уменьшаться до него, но не ниже
min_dlrate=10;  # минимальный download rate rTorrent в килобайтах. Скорость будет уменьшаться до него, но не ниже 
step_rate=10;   # шаг изменения rate в килобайтах
max_uprate=50;  # максимальный upload rate rTorrent в килобайтах. При появлении форвардного трафика будет выставлен именно он. При дальнейшем росте форвардного трафика rate будет уменьшаться вплоть для min_uprate
max_dlrate=50;  # максимальный download rate rTorrent в килобайтах. При появлении форвардного трафика будет выставлен именно он. При дальнейшем росте форвардного трафика rate будет уменьшаться вплоть для min_dlrate
max_count_change_rate=5;  # максимально колличество пропущенных изменений rate. После этого колличества rate будет изменен по любому
interval_rate=5;    # частота точнее интервал, в секундах, с которой дергается скрипт. Должен совпадать с тем, что указано в конфиге rTorrent
enable_log=0;  # признак ведения лога 0-не вести лог. 1-вести лог, 2-вести подробный лог, 3-лог с промежуточными переменными
if [ -f $RTSHAPER/rt-shaper.conf ]; then
. $RTSHAPER/rt-shaper.conf
fi

# первым делом проверяем, есть ли процессы wget порожденные скриптом
# если есть, то скрипт дальше не выполняется
if [ -e $PIDUPWGET -a -e $PIDDLWGET ]; then
# файлы c pid'ами существуют
  hasexit=0
  kill -0 $(cat $PIDDLWGET) >/dev/null 2>&1
  res=$?
  [ $enable_log -gt 2 ] && echo "Search dlrate wget pid=$(cat $PIDDLWGET)  res=$res. At " `date` >> $LOGFILE
  if [ $res -eq 0 ]; then
    hasexit=`expr $hasexit + 1`
  fi
  kill -0 $(cat $PIDUPWGET) >/dev/null 2>&1
  res=$?
  [ $enable_log -gt 2 ] && echo "Search uprate wget pid=$(cat $PIDUPWGET)  res=$res. At " `date` >> $LOGFILE
  if [ $res -eq 0 ]; then
    hasexit=`expr $hasexit + 1`
  fi
  if [ $hasexit -gt 0 ]; then
    [ $enable_log -gt 0 ] && echo "Find child wget. Script exit. At " `date` >> $LOGFILE
    exit 0
  fi
fi


# установка  upload rate rTorrent
setuprate(){
  _new_rate=$curr_uprate;
  if [ $_new_rate -ne 0 ]; then 
    _new_rate="$_new_rate"k;
  fi
  
  _post_string="<?xml version=\"1.0\" encoding=\"UTF-8\"?>\
<methodCall>\
 <methodName>set_upload_rate</methodName>\
 <params>\
  <param>\
   <value>\
    <string>$_new_rate</string>\
   </value>\
  </param>\
 </params>\
</methodCall>\
";
  
  /opt/bin/wget -q --post-data="$_post_string" -O - http://127.0.0.1:80/RPC2 > /dev/null&
  pid=$!
  [ $enable_log -gt 2 ] && echo "Set uprate wget pid=$pid  _post_string=$_post_string. At " `date` >> $LOGFILE
  echo $pid > $PIDUPWGET
  [ $enable_log -gt 0 ] && echo "set_upload_rate  $_new_rate.  At " `date` >> $LOGFILE
}

# установка  download rate rTorrent
setdlrate(){
  _new_rate=$curr_dlrate;
  if [ $_new_rate -ne 0 ]; then 
    _new_rate="$_new_rate"k;
  fi
  
  _post_string="<?xml version=\"1.0\" encoding=\"UTF-8\"?>\
<methodCall>\
 <methodName>set_download_rate</methodName>\
 <params>\
  <param>\
   <value>\
    <string>$_new_rate</string>\
   </value>\
  </param>\
 </params>\
</methodCall>\
";

  /opt/bin/wget -q --post-data="$_post_string" -O - http://127.0.0.1:80/RPC2 > /dev/null&
  pid=$!
  [ $enable_log -gt 2 ] && echo "Set dlrate wget pid=$pid  _post_string=$_post_string. At " `date` >> $LOGFILE
  echo $pid > $PIDDLWGET
  [ $enable_log -gt 0 ] && echo "set_download_rate  $_new_rate.  At " `date` >> $LOGFILE
}

# Если файл с текущими значениями есть, то просто подключаем его
if [ -f $VARCAT/curr_state ]; then
. $VARCAT/curr_state
else
  last=0;     # последнее показание форвардного трафика
  last_delta=0; # последний объем трафика прошедший за измеряемый промежуток
  curr_uprate=0; # текущий upload rate
  curr_dlrate=0; # текущий download rate
  curr_state=0; # текущее состояние, если 0, то rtorrent не ограничивается
  count_change_rate_ups=0; # счетчик пропущенных изменений rate, по причине маленького отличия last_delta. После определенного колличества, все равно происходит изменение rate
fi

old_last=$last;
old_last_delta=$last_delta;
old_curr_uprate=$curr_uprate;
old_curr_dlrate=$curr_dlrate;
old_curr_state=$curr_state;
old_count_chahge_rate_ups=$count_change_rate_ups;

fwd=`sudo iptables -t filter -L FORWARD -v -x -n | tail -n 5 | head -n 1 | awk '{print($2)}'`
# обрабатываем переполнение
if [ $fwd -lt $last ]; then
  last=0;
  [ $enable_log -gt 1 ] && echo "Overflow counter forward byte. At " `date` >> $LOGFILE
fi

delta=0;
change_uprate=0;
change_dlrate=0;

[ $enable_log -gt 2 ] && echo "fwd=$fdw  last=$last. At " `date` >> $LOGFILE
if [ $fwd -eq $last ]; then
# форвардного трафика не было
  [ $enable_log -gt 2 ] && echo "curr_state=$curr_state. At " `date` >> $LOGFILE
  if [ $curr_state -gt 0 ]; then
    # если стоит ограничение, то снимаем его
    # но вначале определенное количество раз пропускаем
    [ $enable_log -gt 2 ] && echo "count_change_rate_ups=$count_change_rate_ups. At " `date` >> $LOGFILE
    if [ $count_change_rate_ups -ge $max_count_change_rate ]; then
      curr_state=0;
      last_delta=0;
      curr_uprate=0;
      curr_dlrate=0;
      count_change_rate_ups=0;
      change_uprate=1;
      change_dlrate=1;
    else 
      [ $enable_log -gt 2 ] && echo "count_change_rate_ups++     =$count_change_rate_ups. At " `date` >> $LOGFILE
      count_change_rate_ups=`expr $count_change_rate_ups + 1`;
    fi
  fi
else
  delta=`expr $fwd - $last`;
  last=$fwd;
# если ограничения нет и появился форвардный трафик
  [ $enable_log -gt 2 ] && echo "curr_state=$curr_state delta=$delta. At " `date` >> $LOGFILE
  if [ $curr_state -eq 0 ]; then
    curr_state=1;
    curr_uprate=`expr $max_uprate - $step_rate`;
    curr_dlrate=`expr $max_dlrate - $step_rate`;
    count_change_rate_ups=0;
    change_uprate=1;
    change_dlrate=1;
  else
# а вот если форвардный трафик уже был, то смотрим, прибавляется он или уменьшается
# и в зависимости от этого дергаем скорость rtorrenta
# кроме того, проверяется размер этого изменения, и изменяем, только если он больше определенной велечины
    [ $enable_log -gt 2 ] && echo "delta=$delta  last_delta=$last_delta. At " `date` >> $LOGFILE
    if [ $delta -ge $last_delta ]; then
      # трафик прибавился
      uptrafic=`expr $delta - $last_delta`;
      # если прирост трафика больше половины шага уменьшения скорости для rTorrent
      [ $enable_log -gt 2 ] && echo "uptrafic=$uptrafic  count_change_rate_ups=$count_change_rate_ups. At " `date` >> $LOGFILE
      if [ $uptrafic -ge `expr $step_rate '*' 1024 '*' $interval_rate / 2` -o $count_change_rate_ups -ge $max_count_change_rate ]; then
        # если текущая скорость uprate больше минимальной, то уменьшаем скорость ещё
        if [ $curr_uprate -gt $min_uprate ]; then
          curr_uprate=`expr $curr_uprate - $step_rate`;
          change_uprate=1;
        fi
        # если текущая скорость dlrate больше минимальной, то уменьшаем скорость ещё
        if [ $curr_dlrate -gt $min_dlrate ]; then
          curr_dlrate=`expr $curr_dlrate - $step_rate`;
          change_dlrate=1;
        fi
        if [ $change_uprate -eq 1 -o $change_dlrate -eq 1 ]; then
          curr_state=`expr $curr_state + 1`;
        fi
        count_change_rate_ups=0;
        [ $enable_log -gt 2 ] && echo "curr_uprate=$curr_uprate  curr_dlrate=$curr_dlrate  curr_state=$curr_state  count_change_rate_ups=$count_change_rate_ups. At " `date` >> $LOGFILE
      else
        count_change_rate_ups=`expr $count_change_rate_ups + 1`;
        [ $enable_log -gt 2 ] && echo "count_change_rate_ups++     =$count_change_rate_ups. At " `date` >> $LOGFILE
      fi
    else
      # проходящий трафик уменьшился
      dltrafic=`expr $last_delta - $delta`;
      [ $enable_log -gt 2 ] && echo "dltrafic=$dltrafic  count_change_rate_ups=$count_change_rate_ups. At " `date` >> $LOGFILE
      # если объем трафика уменьшился на щаг  скорости для rTorrent
      if [ $dltrafic -ge `expr $step_rate '*' 1024 '*' $interval_rate` -o $count_change_rate_ups -ge $max_count_change_rate ]; then
        # если текущая скорость uprate больше минимальной, то уменьшаем скорость ещё
        if [ $curr_uprate -lt $max_uprate ]; then
          curr_uprate=`expr $curr_uprate + $step_rate`;
          change_uprate=1;
        fi
        # если текущая скорость dlrate больше минимальной, то уменьшаем скорость ещё
        if [ $curr_dlrate -lt $max_dlrate ]; then
          curr_dlrate=`expr $curr_dlrate + $step_rate`;
          change_dlrate=1;
        fi
        if [ $change_uprate -eq 1 -o $change_dlrate -eq 1 ]; then
          curr_state=`expr $curr_state - 1`;
          # при уменьшении трафика, не даем curr_state уйти в 0
          if [ $curr_state -eq 0 ]; then
            curr_state=1;
          fi
        fi
        count_change_rate_ups=0;
        [ $enable_log -gt 2 ] && echo "curr_uprate=$curr_uprate  curr_dlrate=$curr_dlrate  curr_state=$curr_state  count_change_rate_ups=$count_change_rate_ups. At " `date` >> $LOGFILE
      else
        count_change_rate_ups=`expr $count_change_rate_ups + 1`;
        [ $enable_log -gt 2 ] && echo "count_change_rate_ups++     =$count_change_rate_ups. At " `date` >> $LOGFILE
      fi
    fi
  fi
fi

[ $enable_log -gt 1 ] && echo "Previous forward trafic $last_delta, now forward trafic $delta, current state $curr_state, current upload rate $curr_uprate, current download rate $curr_dlrate. At " `date` >> $LOGFILE
# если необходимо изменение rate, то вызываем соответствующие функции
[ $change_uprate -eq 1 ] &&  setuprate
[ $change_dlrate -eq 1 ] && setdlrate

last=$fwd;
last_delta=$delta;

if [ $old_last -ne $last -o $old_last_delta -ne $last_delta -o $old_curr_uprate -ne $curr_uprate -o $old_curr_dlrate -ne $curr_dlrate -o $old_curr_state -ne $curr_state -o $old_count_chahge_rate_ups -ne $count_change_rate_ups ]; then
echo -e "last=$last\nlast_delta=$last_delta\ncurr_uprate=$curr_uprate\ncurr_dlrate=$curr_dlrate\ncurr_state=$curr_state\ncount_change_rate_ups=$count_change_rate_ups\n" > $VARCAT/curr_state;

[ $enable_log -gt 2 ] && echo "Exit script.   last=$last  last_delta=$last_delta  curr_uprate=$curr_uprate  curr_dlrate=$curr_dlrate  curr_state=$curr_state  count_change_rate_ups=$count_change_rate_ups. At " `date` >> $LOGFILE
else

[ $enable_log -gt 2 ] && echo "Exit script.   No change temperary varables. $VARCAT/curr_state not save. At " `date` >> $LOGFILE
fi
exit 0
 
Строчки, которые нужно поменять под себя я выделил красным. 
RTSHAPER= - каталог, в котором лежит сам скрипт
VARCAT= - каталог временных файлов
LOGFILE= - логфайл


В каталог /opt/etc/rt-shaper можно положить файл с настройками, которые будут использоваться в работе скрипта. Файл rt-shaper.conf



min_uprate=50; # минимальный upload rate rTorrent в килобайтах. Скорость будет уменьшаться до него, но не ниже
min_dlrate=10; # минимальный download rate rTorrent в килобайтах. Скорость будет уменьшаться до него, но не ниже
step_rate=10; # шаг изменения rate в килобайтах
max_uprate=70; # максимальный upload rate rTorrent в килобайтах. При появлении форвардного трафика будет выставлен именно он. При дальнейшем росте форвардного трафика rate будет уменьшаться вплоть для min_uprate
max_dlrate=50; # максимальный download rate rTorrent в килобайтах. При появлении форвардного трафика будет выставлен именно он. При дальнейшем росте форвардного трафика rate будет уменьшаться вплоть для min_dlrate
max_count_change_rate=5; # максимально количество пропущенных изменений rate. После этого количества rate будет изменен по любому
interval_rate=7; # частота точнее интервал, в секундах, с которой дергается скрипт. Должен совпадать с тем, что указано в конфиге rTorrent
enable_log=0; # признак ведения лога 0-не вести лог. 1-вести лог, 2-вести подробный лог, 3-лог с промежуточными переменными

Можно конфиг и не ложить, а задать все необходимые значения прямо в скрипте.

Параметры: min_uprate, min_dlrate, max_uprate, max_dlrate, step_rate - задаются в килобайтах. Т.е. сейчас, при наличии форвардного трафика скорость скачки будет гулять в интервале между 10 килобайтами и 50 килобайтами, а скорость отдачи между 50 килобайтами и 70 килобайтами с шагом в 10 килобайтами.

Параметр: interval_rate - должен совпадать с тем значением, которое будет указано для шедулера rTorrent, который будет запускать скрипт.

Подключение скрипта к rTorrent

Для подключения скрипта к rTorrent, нужно добавить одну строчку в конфиг rTorrent.

У меня конфиг rTorrent лежит в /opt/etc/rtorrent.conf

Добавляем туда строку:



schedule = rtshaper,15,7,execute=/opt/etc/rt-shaper/rt-shaper.sh


Здесь: 15 - задержка, в секундах, после которой rTorrent начнет запускать скрипт на выполнение. 7 - интервал, в секундах, с которым rTorrent будет запускать скрипт, должен совпадать с параметром interval_rate из rt-shaper.conf.

   
Вот собственно и все. Надеюсь, что я ни чего не пропустил.