Содержимое flashing.cmd:
@Echo Off :BEGIN ping -n 1 -w 1 192.168.0.1 If errorlevel 1 Goto BEGIN If errorlevel 0 Goto FLASH Goto END :FLASH Echo *** Start Flashing **** tftp -i 192.168.0.1 put firmware.bin :END
via l0ner
Далее инструкция «для ленивых», ежели кому вдруг понадобится реализовать сию конструкцию, не вдаваясь в технические подробности:
c:\> telnet 192.168.0.1
Login: admin
Password: admin
Дальше упражняемся в консоли телнетовской сессии (лучше через copy/paste, чтобы не ошибиться в написании). Для начала нам необходимо определить vendor и product code для нашего модема. Для каждого устройства они уникальны. В открытой сессии telnet даём команду:
$ tail -f /usr/tmp/syslog.log - смотрим логи ядра системы в реальном времени.
Теперь вставляем модем (в моём случае это AnyData ADU-300A) в USB-порт роутера и наблюдаем за происходящим. На экране должно появиться нечто подобное:
Okt 29 05:02:09 kernel: hub.c: new USB device 00:03.0-1, assigned address 2 Okt 29 05:02:09 kernel: usb.c: USB device 2 (vend/prod 0x16d5/0x6506) IS NOT claimed BY any active driver.
Записываем параметры vendor и product. Выходим по Ctrl-C.
Проверяем запуск порта модема:
$ insmod usbserial vendor=0x16d5 product=0x6506 (не забываем указывать ваши собственные значения!) $ls -l /dev/usb/* на экране должно появиться что вроде этих строк: crw------- 1 admin root 188, 0 Okt 29 2009 0 crw------- 1 admin root 188, 1 Okt 29 2009 1 Отлично! Нам теперь доступны следующие порты: /dev/usb/tts/0 /dev/usb/tts/1 из которых нам понадобится первый - tts0.
Теперь добавляем скрипты дозвона ppp-соединения:
Создаём файл /tmp/ppp/peers/dialup, но сначала недостающий каталог peers:
$mkdir /tmp/ppp/peers
Запускаем редактор и используем обычный «копипаст»:
$vi
В редакторе vi переходим в режим редактирования, нажав «i», и вставляем код, начиная с верхнего левого угла:
debug /dev/usb/tts/0 115200 crtscts noipdefault ipcp-accept-local lcp-echo-interval 60 lcp-echo-failure 5 usepeerdns noauth nodetach mtu 1400 mru 1400 user 'cdma' password 'cdma' connect "/usr/sbin/chat -s -S -V -t 60 -f /tmp/ppp/dialup.chat 2 > /tmp/chat.log"
Жмём «Esc» и сохраняем в файл командой
:w /tmp/ppp/peers/dialup
Выходим из редактора
:q
для проверки делаем просмотр созданного файла командой:
$cat /tmp/ppp/peers/dialup
Следующий файл /tmp/ppp/dialup.chat копипастим аналогично:
$vi
'' '' '' 'ATZ' 'OK' 'ATD #777' 'CONNECT' ''
Esc → :w /tmp/ppp/dialup.chat → :q
результат:
Добавляем созданные файлы в /tmp/local/.files командами:
$echo /tmp/ppp/peers/dialup > /tmp/local/.files $echo /tmp/ppp/dialup.chat » /tmp/local/.files
Сохраняемся в память роутера
$flashfs save && flashfs commit && flashfs enable
И перегружаем роутер командой:
$reboot
Теперь можно перекурить, а заодно и проверить работоспособность соединения перед завершающим этапом. Файлы дозвона у нас уже сохранены, необходимо лишь еще раз, вручную, запустить порт модема.
$insmod usbserial vendor=0x16d5 product=0x6506
Теперь можем пробовать соединиться. Обратите внимание - в нашем скрипте dialup указан параметр nodetach, поэтому мы будем оставаться в открытой сессии до нажатия Ctrl-C. Таким образом, можно будет увидеть, что происходит в процессе дозвона:
$pppd call dialup
После ввода команды в нашей телнетовской терминальной сессии должно происходить что-то подобное:
Script /usr/sbin/chat -s -S -V -t 60 -f /tmp/ppp/dialup.chat 2>/tmp/chat.log finished (pid 162), status = 0x0 Serial connection established. using channel 2 Using interface ppp0 Connect: ppp0 <--> /dev/usb/tts/0 ............................................................ local IP address 10.50.29.187 remote IP address 10.50.29.148 primary DNS address 80.255.144.8 secondary DNS address 80.255.1.9 Script /tmp/ppp/ip-up started (pid 165) Script /tmp/ppp/ip-up finished (pid 165), status = 0x0
Теперь уже можно открыть браузер, спросить что-нибудь у гугля (или яндекса, по вкусу), зайти на любимый сайт… Можно также проверить скорость соединения через http://speedtest.net/ или подобные, чтобы убедиться, что она не ниже, чем было при прямом подключении к компьютеру. Для завершения соединения возвращаемся в окно telnet и жмём Ctrl-C.
Чтобы постоянно не прописывать все эти интересные и увлекательные штуки при каждом включении роутера, создадим файл автозапуска порта модема и соединения - /tmp/local/sbin/post-boot
$mkdir /tmp/local/sbin
Наполняем файл автозагрузки:
#!/bin/sh insmod usbserial vendor=0x16d5 product=0x6506 sleep 5 pppd call dialup
Esc → :w /tmp/local/sbin/post-boot → :q
Что бы наш файл мог выполниться системой при загрузке, присваиваем ему атрибут выполнения:
$chmod +x /tmp/local/sbin/post-boot
И не забываем сохраняться
$flashfs save && flashfs commit
Всё готово! Перегружаемся и пробуем!
$reboot
Для контроля выполнения команд можно открыть сессию телнет с командой:
$tail -f /usr/tmp/syslog.log
Наслаждаемся работой системы!
Важно! Коды Vendor и Product в статье указаны для моего модема! Не забывайте менять их для своих устройств!
Восстановление оригинальной прошивки D-Link DIR-320
Если Вам потребовалось восстановить оригинальную прошивку роутера D-Link DIR-320, то делаем следующее:
#!/bin/sh ipkg.sh update ipkg.sh install ipkg echo "src unslung http://ipkg.nslu2-linux.org/feeds/optware/oleg/cross/stable" > /opt/etc/ipkg.conf echo "dest root /" >> /opt/etc/ipkg.conf ipkg update ipkg install uclibc-opt ipkg install openssl ipkg install lzo ipkg -force-depends install openvpn mkdir /dev/net mknod /dev/net/tun c 10 200 echo "dev tun0" > /opt/etc/openvpn/server.conf echo "port 5190" >> /opt/etc/openvpn/server.conf echo "proto tcp-server" >> /opt/etc/openvpn/server.conf echo "ifconfig 10.8.0.1 10.8.0.2" >> /opt/etc/openvpn/server.conf echo "secret static.key" >> /opt/etc/openvpn/server.conf mkdir /usr/local/sbin echo "#!/bin/sh" > /usr/local/sbin/post-boot echo "mount /tmp/local/opt /opt" >> /usr/local/sbin/post-boot echo "/opt/etc/init.d/S24openvpn" >> /usr/local/sbin/post-boot chmod +x /usr/local/sbin/post-boot echo "#!/bin/sh" > /usr/local/sbin/post-firewall echo "iptables -D INPUT -j DROP" >> /usr/local/sbin/post-firewall echo "iptables -I INPUT -p tcp --dport 5190 -j ACCEPT" >> /usr/local/sbin/post-firewall echo "iptables -t nat -I PREROUTING -i eth1 -p tcp --dport 5190 -j DNAT --to-destination \$4:5190" >> /usr/local/sbin/post-firewall echo "iptables -A INPUT -j DROP" >> /usr/local/sbin/post-firewall echo "iptables -I INPUT -i tun0 -j ACCEPT" >> /usr/local/sbin/post-firewall echo "iptables -I FORWARD -i tun0 -j ACCEPT" >> /usr/local/sbin/post-firewall echo "iptables -I FORWARD -o tun0 -j ACCEPT" >> /usr/local/sbin/post-firewall echo "iptables -I OUTPUT -o tun0 -j ACCEPT" >> /usr/local/sbin/post-firewall chmod +x /usr/local/sbin/post-firewall echo "#!/bin/sh" > /opt/etc/init.d/S24openvpn echo 'if [ -n "`pidof openvpn`" ]; then' >> /opt/etc/init.d/S24openvpn echo "/bin/killall openvpn 2>/dev/null" >> /opt/etc/init.d/S24openvpn echo "fi" >> /opt/etc/init.d/S24openvpn echo "/sbin/insmod tun" >> /opt/etc/init.d/S24openvpn echo "echo 1 > /proc/sys/net/ipv4/ip_forward" >> /opt/etc/init.d/S24openvpn echo "/opt/sbin/openvpn --cd /opt/etc/openvpn --daemon --log-append /var/log/openvpn.log --config server.conf" >> /opt/etc/init.d/S24openvpn chmod +x /opt/etc/init.d/S24openvpn echo "/usr/local/sbin/post-firewall" > /usr/local/.files echo "/usr/local/sbin/post-boot" > /usr/local/.files mv /tmp/local/static.key /opt/etc/openvpn flashfs save flashfs commit flashfs enable reboot