Делаем из роутера минисервер. Часть 2 — пишем скрипты

DIR-320 + HDD + 3G-модем + принтер

Настройка хранения статистики трафика

В прошивке Tomato есть очень хороший мониторинг интернет трафика. Но по-умолчанию вся статистика хранится в оперативной памяти роутера, вследствие при перезагрузках и выключениях статистика обнуляется.
Исправим это положение. А также напишем вспомогательные скрипты для упрощения жизни 🙂

dscf2998
Создадим новый каталог «rstats» в /opt

mkdir /opt/rstats

В админке идём в раздел «Administration — Bandwidth Monitoring» и прописываем свой путь для сохранения истории: /opt/rstats/
Интервал сохранения для флэшки ставим 3-4 часа, для жёсткого диска — 1 час. Также ставим галочку «Create New File (Reset Data)» — («создать новый файл») Это нужно для того, чтобы система создала необходимые файлы в новом указанном месте.
bandwidth_monitor
После этого вся статистика будет надёжно храниться на флэшке/HDD.
bandwidth_monitor2

status_led

В прошивке Tomato индикатор состояния роутера (второй слева) горит непрерывно после его загрузки, поэтому невозможно понять, работает ли роутер, или он завис. Исправим это положение. Для этого напишем небольшой скрипт и сохраним его под именем /opt/etc/scripts/blinkled.sh

1
2
3
4
5
6
7
8
9
#!/bin/sh
 
sleep 30
while true ; do
led diag off
sleep 1
led diag on
sleep 1
done

Также напишем скрипт, для уведомления об активности WAN-соединения с помощью индикатора «принтер».
/opt/etc/scripts/wlan_mon.sh

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/sh
 
# при передаче данных, индикатор будет загораться
while sleep 1; do
  XFER=`ifconfig ppp0|grep bytes`
  if [ "$XFER" != "$PXFER" ]; then
    led mystery on
    PXFER=$XFER
  else
    led mystery off
  fi
done

/opt/etc/init.d/rc.firewall

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/sh
# Здесь помещаем все команды, которые необходимо выполнить перед стартом фаервола
 
logger "Script started /opt/etc/init.d/rc.firewall"
 
# Раскомментируйте следующую строчку, если у вас возникают проблемы с автоматическим установлением соединения с Интернетом.
# service wan restart
 
# Запускаем SNMP демон
if [ -x /opt/etc/init.d/S70net-snmp ]; then
  logger "Starting SNMP daemon"
  /opt/etc/init.d/S70net-snmp
fi
 
# Запускаем веб-сервер
if [ -x /opt/etc/init.d/S80thttpd ]; then
  logger "Starting thttpd server"
  /opt/etc/init.d/S80thttpd
fi
 
/opt/etc/scripts/wlan_mon.sh &

/opt/etc/init.d/rc.shutdown

1
2
3
#!/bin/sh
# Если вы хотите выполнить какие-либо команды перед завершением работы роутера, то поместите их в этом скрипте
logger "Script started /opt/etc/init.d/rc.shutdown"

/opt/etc/init.d/rc.wanup

1
2
3
#!/bin/sh
# Если вы хотите выполнить какие-либо команды при установлении WAN соединения, то поместите их в этом скрипте
logger "Script started /opt/etc/init.d/rc.wanup"

Теперь открываем в админке раздел «Administration — Scripts» и пишем следующие скрипты:
Firewall

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
logger "Firewall"
mkdir -p /tmp/mnt/sd
mount /dev/discs/disc0/part1 /tmp/mnt/sd
 
# Монтируем /opt . Выбор делается в зависимости от подключенного накопителя.
# system - имя раздела на жестком диске, sd - на флэшке.
# параметр noatime при монтировании флэшнакопителя позволяет снизить его износ.
if [ ! -d /opt/bin ]; then
  if [ -d /mnt/system ]; then
    mount -t ext3 -obind /mnt/system/Optware /opt
  else
    mount -o noatime -t ext3 -obind /mnt/sd/Optware /opt
  fi
  if [ -x /opt/etc/init.d/rc.firewall ]; then
    /opt/etc/init.d/rc.firewall
  fi
fi

Init

1
2
3
logger "Init"
# запускаем индикатор активности роутера
/usr/sbin/blinkled.sh &

Shutdown

1
2
3
4
5
6
7
8
logger "Shutdown"
led mystery off
killall blinkled.sh
if [ -x /opt/etc/init.d/rc.shutdown ]; then
  /opt/etc/init.d/rc.shutdown
fi
umount /opt
umount /mnt/sd

WAN up

1
2
3
4
logger "WAN Up"
if [ -x /opt/etc/init.d/rc.wanup ]; then
  /opt/etc/init.d/rc.wanup
fi

Итог

В результате мы получили минисервер, на котором можно разместить небольшой HTML-сайт, качать торренты, хранить файлы и многое другое.
В дальнейших статьях я расскажу как подружить роутер с Freeduino.

Похожие записи:

64 Комментарии “Делаем из роутера минисервер. Часть 2 — пишем скрипты

  1. Все очень понравилось , но не все пока получилось . А если что спросить… не пойму как.
    Ладно Tomato у Вас синего цвета, но как меню на русс. яз сделать — обыскался.
    Еще раз , спасибо.

    1. Спасибо за отзыв. Извиняюсь за долгое отсутствие.
      Прошивку я переводил сам, для этого необходимо скачать Firmware Mod Kit. С помощью него можно распаковать, а затем упаковать прошивку.
      Если будут какие-либо вопросы — задавайте 🙂

    1. Можно набирать скрипты непосредственно подключившись к роутеру по SSH или Telnet. В этом случае удобнее будет установить Midnight Commander (ipkg-opt install mc).
      Второй способ — набрать скрипт в любом текстовом редакторе, который поддерживает UNIX-формат перевода строк (я пользуюсь SciTe), а затем залить его в память роутера или флэш-накопитель. Чтобы скрипт сделать запускаемым, необходимы выполнить команду chmod +x script.sh, где script.sh — имя вашего скрипта.

  2. Приветствую! Очень заинтересовала данная статья, и в этой связи хотел бы задать пару ламерских вопросов.
    1) Возможна ли установка на D-Link DIR-320-N ? Насколько я понял, опыты ставились на предыдущей модели, которая без N.
    2) Корректо ли будут работать точка доступа?
    Спасибо

    1. Доброго дня суток)
      1) Да, действительно, у меня роутер без приставки N. Установка возможна при условии наличия прошивок под данную модель (к сожалению не знаю, существуют ли они).
      2) На работоспособность железа эти скрипты никак не влияют. Я стараюсь не писать код, который сильно загружает процессор)

  3. Спасибо за оперативность 🙂 Продолжаю, с вашего разрешения)

    1) Как и где выяснить, поддерживается оно или нет?
    Вопрос обусловлен желанием построить дома сетевую файлопомойку, качающую и раздающую торренты, однако покупать NAS (особенно с Wi-Fi) дороже и скучнее, чем использовать вышеописанное ршение. Но в нашем городе уже не достать, наверное, роутер без суффикса «N» 🙁

    2) Я правильно понял, что прошивка самого роутера остаётся без изменений и потери работоспособности? Т.е. «родная» прошивка остаются нетротой, а весь навешенный дополнительный функционал работает не «вместо», а рядом с оригиналом?

    3) Нельзя ли повесить внутрь роутера обычный дистрибутив Linux (Debian, Ubuntu)? Без «иксов», понятное дело. Если можно — с чем возникнут проблемы, если нет — почему?

    Спасибо 🙂

    1. 1) Я сейчас бегло поискал, не нашёл поддержки 320NRU. Год назад прошивки точно под него не было.
      2) Нет. Прошивка полностью меняется на альтернативную неофициальную. Стандартные прошивки не очень стабильные (по крайней мере в моей модели).
      3) Нет. Так как архитектура процессоров совершенно разная. В роутере ARM процессор, поэтому в нём применяется урезанная версия Linux. Есть также порты FreeBSD. Да и ROM-памяти (4 Мб) не хватит под обычный дистрибутив.

    1. Надеюсь со временем умельцы сделают прошивку)
      Кстати, про NAS: скорость чтения/записи с жёсткого диска на роутере значительно меньше. и составляет 2-3 МБ/сек. Поэтому полноценно использовать его не получится.

  4. Почему-то не могу создать каталог rstats в /opt. Вот что говорит Putty: mkdir: can’t greate directory ‘/opt/rstats’: Read only file system. Вообще не могу создать никакой каталог в /opt. Выскакивает эта же ошибка

      1. Я пробовал через WinSCP. Заходил по адресу роутера, далее в папку /opt, в ней хотел создать каталог rstats. Выскакивала ошибка, что невозможно создать каталог, директория только для чтения!

          1. Извиняюсь, не очень силен в Linux, прошивка томато 1.28. Т.е сначала мне нужно подрубить флешку, далее создать на ней каталог opt и потом уже производить действия описанные вами выше

  5. спасибо. разобрался.только никак не могу сделать так чтобы индикатор принтер моргал. когда подключен модем к инету. Куда вписывать команду на выполнение скрипта?

      1. Создать файл и в него записать скрипт. Optware установлено?

        >> «чтобы индикатор принтер моргал. когда подключен модем к инету»
        Про это пока сказать не могу, у меня он мигает при передаче/приёме данных.

  6. Да все установил. Я немного не так выразился, чтобы моргал при приеме/передаче данных. А вот это куда вписать chmod +x ?

  7. и еще статистика не сохраняется вот такое сообщение The rstats program is not responding or is busy. Try reloading after a few seconds.

      1. Это результат после команды mount
        login as: root
        root@192.168.1.1’s password:

        Tomato v1.28.0180 ND USB Std
        root@unknown:/tmp/home/root# mount
        rootfs on / type rootfs (rw)
        /dev/root on / type squashfs (ro)
        none on /dev type devfs (rw)
        proc on /proc type proc (rw)
        tmpfs on /tmp type tmpfs (rw)
        usbdevfs on /proc/bus/usb type usbdevfs (rw)
        /dev/discs/disc0/part1 on /tmp/mnt/Qumo type ext3 (rw,noatime,nodev)
        /dev/discs/disc0/part1 on /opt type ext3 (rw,noatime,nodev)
        root@unknown:/tmp/home/root#

        А это другая команда
        ls -l /opt
        drwxr-xr-x 2 root root 4096 Apr 19 19:45 bin
        drwxr-xr-x 3 root root 4096 Apr 19 19:45 etc
        drwxr-xr-x 4 root root 4096 Apr 19 19:45 include
        drwxr-xr-x 7 root root 4096 Apr 19 19:45 lib
        drwxr-xr-x 3 root root 4096 Apr 19 19:45 libexec
        drwxr-xr-x 2 root root 4096 Apr 19 19:46 rstats
        drwxr-xr-x 2 root root 4096 Apr 19 19:41 sbin
        drwxr-xr-x 11 root root 4096 Apr 19 19:45 share
        drwxr-xr-x 3 root root 4096 Feb 17 01:36 usr
        root@unknown:/tmp/home/root#

        1. drwxr-xr-x 2 root root 4096 Apr 19 19:46 rstats

          доступа на запись в папку нет, значит chmod почему-то не сработал. Midnight Commander не устанавливали? Через него можно попробовать установить права доступа

  8. Сейчас еще раз ввел chmod, вот что получилось
    login as: root
    root@192.168.1.1’s password:

    Tomato v1.28.0180 ND USB Std
    root@unknown:/tmp/home/root# ls -l /opt
    drwxr-xr-x 2 root root 4096 Apr 19 19:45 bin
    drwxr-xr-x 3 root root 4096 Apr 19 19:45 etc
    drwxr-xr-x 4 root root 4096 Apr 19 19:45 include
    drwxr-xr-x 7 root root 4096 Apr 19 19:45 lib
    drwxr-xr-x 3 root root 4096 Apr 19 19:45 libexec
    drwxrwxrwx 2 root root 4096 Apr 19 19:46 rstats
    drwxr-xr-x 2 root root 4096 Apr 19 19:41 sbin
    drwxr-xr-x 11 root root 4096 Apr 19 19:45 share
    drwxr-xr-x 3 root root 4096 Feb 17 01:36 usr
    root@unknown:/tmp/home/root#

  9. Может я неправильно создал profile в /opt/etc. Я делал так: зашел через WinSCP в opt/etc и там создал файл с именем profile и скопировал все как описано в 1части статьи и вставил в созданный файл, затем сохранил. При этом никакого расширения файла profile не прописал. Это правильно или нужно создать каким-то другим способом?

      1. вот что выдает
        login as: root
        root@192.168.1.1’s password:

        Tomato v1.27.0652 ND USB Std

        BusyBox v1.14.4 (2010-07-19 15:24:13 EEST) built-in shell (ash)
        Enter ‘help’ for a list of built-in commands.

        root@unknown:/tmp/home/root# ls -l /opt/etc | grep profile
        -rw-r—r— 1 root root 758 Apr 20 18:11 profile.conf
        root@unknown:/tmp/home/root#

        1. а почему profile.conf ? у него не должно быть расширения. К тому же он не выполняется.
          «chmod +x имя_файла» — разрешить выполнение скрипта

  10. login as: root
    root@192.168.1.1’s password:

    Tomato v1.27.0652 ND USB Std

    BusyBox v1.14.4 (2010-07-19 15:24:13 EEST) built-in shell (ash)
    Enter ‘help’ for a list of built-in commands.

    root@unknown:/tmp/home/root# ls -l /opt/etc | grep profile
    -rwxr-xr-x 1 root root 758 Apr 20 19:25 profile
    root@unknown:/tmp/home/root#

  11. ну никак не хочет сохраняться статистика на флешку. Все сделал снова. роутер перепрошил, снова установил optware, линукс поставил. сейчас пытаюсь все снова сделать из-под линуха. никак не получается. Помогите, пожалуйста. Все равно выскакивает вот такое The rstats program is not responding or is busy. Try reloading after a few seconds.
    Может лучше по электронке общаться, там я хоть скрины могу выложить

      1. тоже ничего не получалось пока галочку напротив «Create New File
        (Reset Data)» не поставил и Save не нажал

        1. Да, спасибо за ответ. Статья делалась немного позже проделанных операций, поэтому что-то мог забыть. Сейчас добавлю это.

  12. Большое спасибо за мануал. Всё никак не нарадуюсь прирученной железкой. Возник вопрос: можно ли подключить к роутеру два модема 3G (предпочтительно хуевей e1550 и выше) одновременно? Беглый гуглёж не помогает. Имеется сам роутер с Tomato, USB-разветвитель на 4 гнезда (и доппитание), модемы. Хочется запитаться от 2х разных операторов, хотя бы в режиме авторезервирования, но лучше параллельная работа. Думаю, вопрос актуальный. Заранее, спасибо.

    1. С этим к сожалению не могу поэкспериментировать ввиду отсутствия второго модема. Но что-то мне подсказывает, что на роутере это не выйдет.

  13. Спасибо за интересную статью.

    А можно ли программно заставлять роутер переустанавливать WAN-соединение с уже хранящимися настройками?

    Мне бы написать скрипт и вызывать его с десктопа, дабы каждый не логиниться через веб-интерфейс и не делать это вручную? Не могли бы вы мне подсказать, что делать и толкнуть меня в правильном направлении?

    Заранее спасибо.

    1. Для переподключения существует команда «service wan restart», вводить её естественно необходимо в консоли роутера. Чтобы это делать с рабочего стола, можно поступить следующим образом:
      1. Понадобится клиент Putty. В настройках роутера необходимо включить доступ по SSH.
      2. Создайте в папке Putty текстовый файл «wan_restart.txt» со следующим содержимым:
      service wan restart

      3. Теперь можно создать на рабочем столе ярлык на объект «D:\putty\putty.exe root@192.168.1.1 -pw password -m wan_restart.txt»
      где вместо «password» впишите ваш пароль, «192.168.1.1» — IP роутера.

      1. Большое спасибо за ответ. Покопался в роутере. Я когда-то менял прошивку на асусовскую, в ней он комманды service не знает. Потыкался в sbin и нашел аналогичную ей «rc restart». Теперь проблема с putty:

        Запускаю так:
        «D:\Program Files (x86)\Putty\putty.exe» -v -ssh 192.168.0.1 -l admin -pw ******* -m «D:\Program Files (x86)\Putty\wan_restart.txt»

        Содержимое файла:
        rc restart
        exit

        Если убрать параметр -m, то консоль путти открывается и логинится корректно. С -m же содержимое файла не исполняется. В консоли при этом можно набирать всё что угодно и она вроде бы отвечает. Что мне делать? Как мне быть?

          1. Да, если просто из под путти заходить и вбивать руками rc restart, то работает как надо. Если пытаться скормить файл, то появляется и исчезает без результатов. Пытался с виндовыми и линуховыми переносами строки — без результатов.

            Кстати, если в путти в настройках SSH прописать то же действие в Remote command — тоже выходит моментально без каких-либо объяснений.

            Логи, путти, наскольо мне видно, перенаправить в файл нельзя?

  14. Здравствуйте, уважаемый NightFlash!

    Хотел бы спросить: а на каком языке пишутся скрипты? Как и где и вообще научится обрабатывать Linux? Только открываю эту замечательную область, поэтому такие вопросы.

  15. Здравствуйте! Вот возникает вопрос. Можно ли сделать из роутера, например асус W520gu, консольный сервер какой нибудь игры, так чтобы можно было полностью автоматизировать весь процесс, и следить на удаленнов расстоянии. (сервер должен крутиться в самом роутере, а юсб использовать как базу данных сервера.)

  16. 1) подойдет ли D-LINK 500T?
    вообще какие есть альтернативы?
    2) у Вас стоит usb 3G-модем, как обойтись без него, присоединившись к роутеру, раздающему интернет

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *