Обновление ASUS WL-520GU на прошивку DD-WRT

На днях перепрошил свой старенький, но тем не менее, работающий верой и правдой, маршрутизатор ASUS WL-520GU. Перешел со стокой прошивки (последняя версия 7.0.1.45) на стороннюю DD-WRT. Причина — более продвинутые возможности и настройки + вечное желание пощупать чего-то новенького 🙂

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

Вот что нужно сделать (инструкция для Mac OS):

  1. Скачать этот архив. Он содержит три файла — «легкую» (устанавливается первой) и стандартную версию прошивки DD-WR (v24-sp2), а также стоковую прошивку ASUS WL-520GU (на случай форс-мажора, чтобы можно было откатиться назад).
  2. В настройках роутера установить для него IP-адрес 192.168.1.1.
  3. Перевести роутер в режим восстановления — для этого отключаем роутер, зажимаем углубленную кнопку «Reset» (черного цвета) и включаем роутер в сеть. Кнопку «Reset» удерживать до тех пор, пока индикатор «Power» не начнет мигать с частотой один раз в секунду. Также советуют отключить от роутера все сетевые кабели, за исключением того, что связывает его с компьютером.
  4. Теперь в сетевых настройках Mac OS нужно указать IP-адрес 192.168.1.2 (маска 255.255.255.0, шлюз 192.168.1.1). Теперь неплохо бы убедиться, что компьютер видит роутер — нужно пропинговать IP-адрес 192.168.1.1. Если видит, то можно переходить к следующему пункту. Если нет, значит где-то есть ошибочка.
  5. Настало время залить в роутер «легкую» версию прошивки DD-WR. Делается это через TFTP, который по умолчанию уже имеется в Mac OS. Открываем терминал, переходим в папку, куда распаковали архив с прошивками, и вводим следующие команды:
  6. tftp
    tftp> connect 192.168.1.1
    tftp> binary
    tftp> rexmt 1
    tftp> timeout 60
    tftp> put dd-wrt.v24_mini_asus.trx
  7. Прошивка должна отправится в роутер. После чего нужно подождать минуты три и выключить роутер, а затем снова его включить. Опять подождать, когда он загрузится. Теперь в браузере ввести http://192.168.1.1, должна открыться страница вашей новой прошивки DD-WR.
  8. Через интерфейс DD-WR залить стандартную прошивку (dd-wrt.v24-17990_NEWD_std-nokaid_usb.bin).

[Debian] Включение цвета вывода для ls в консоли

Чтобы задействовать цветное выделение данных, выводимых командой ls, достаточно раскомментировать в файле .bashrc (если работаете из под root’а, то находится в директории /root) следующие строки:

export LS_OPTIONS='--color=auto'
eval "`dircolors`"
alias ls='ls $LS_OPTIONS'

Чтобы изменения вступили в силу, нужно выполнить:

. ~/.bashrc

Результат:

ls_color

Просмотр подключенных модулей у Apache и nginx

Порой нужно узнать, какие модули подключены для Apache или nginx. К примеру, буквально пару дней назад необходимо было выяснить, подключен ли модуль mod_deflate у Apache.

Выполняем:

apache2ctl -M

Читаем:

Loaded Modules:
core_module (static)
...
deflate_module (shared)
...
Syntax OK

Для nginx также есть команда, которая показывает подробную информацию о сборке:

nginx -V

Читаем:

nginx version: nginx/x.x.0
built by gcc 4.4.5 (Debian x.x.x-x)
TLS SNI support enabled
configure arguments:
...
--with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-http_auth_request_module --with-mail --with-mail_ssl_module --with-file-aio --with-cc-opt='-g -O2 -Wp,-D_FORTIFY_SOURCE=2' --with-ld-opt=-Wl,--as-needed --with-ipv6

Auto pull при каждом коммите в GitHub

Разработчик пишет код, коммитит, пушит в GitHub… И для некоторых задач весьма хочется, чтобы эти изменения сразу появлялись на нашем тестовом сервере. Т.е. по сути нам нужно, чтобы при комитте происходил автоматический вызов команды ‘git pull’ на тестовом сервере.

В сети есть несколько решений тому, как эту функциональность реализовать. Свой выбор становил на скрипте «Github Auto Pull«, который умеет еще отправлять алерты на указанную почту. Все бы ничего, но я столкнулся с проблемой — строчка shell_exec('git pull') ни как не хотела правильно выполняться. Стоит оговориться, что мне пришлось изменить строку вызова команды на следующую: shell_exec('cd /path-to-git-project && git checkout %branch% && git pull');

И так, я начал искать причину проблемы. Для начала попытался выполнить скрипт через CLI, оставив в нем лишь строчку с shell_exec:

php github.php — так все работает

Хм, следующее, что пришло на ум, это возможная проблема с пользователем, которому принадлежит скрипт (мол, выполнять команды в shell-оболочке запрещено). Переключился на этого пользователя, вновь запустил «php github.php» и что вижу:

Could not create directory '/var/www/.ssh'.
The authenticity of host 'github.com (192.30.252.128)' can't be established.
RSA key fingerprint is 15:27:ac:a5:76:29:2d:36:63:1b:56:1d:eb:da:a6:58.
Are you sure you want to continue connecting (yes/no)? yes
Failed to add the host to the list of known hosts (/var/www/.ssh/known_hosts).
Permission denied (publickey).
fatal: The remote end hung up unexpectedly

Т.е. проблема была в том, что осуществлялась попытка установить RSA-ключ, в несуществующую для этого пользователя директорию. Создал директорию, скопировал содержимое из /root/.ssh и все заработало.

Еще одна победа!

pkgutil — утилита для управления пакетами (.pkg) в Mac OS X

В Mac OS X есть утилита под названием pkgutil, предназначенная для манипуляции с установщиками пакетов.

Чтобы вывести список всех установленных пакетов, достаточно выполнить команду

pkgutil --packages

Чтобы найти нужный пакет, можно воспользовать grep’ом:

pkgutil --packages|grep ...

Чтобы отобразить список всех файлов, принадлежащих конкретному пакету, нужно использовать параметр —files. В примере ниже выводится список файлов для пакета ru.mail.macagent:

pkgutil --files ru.mail.macagent

Mail.Ru Agent.app
Mail.Ru Agent.app/Contents
Mail.Ru Agent.app/Contents/Frameworks
Mail.Ru Agent.app/Contents/Frameworks/Growl.framework
Mail.Ru Agent.app/Contents/Frameworks/Growl.framework/Growl
...

Если вы удаляете файлы пакета вручную, то после таких действий нужно указать системе, чтобы она «забыла» такой пакет:

pkgutil --forget package-name

Обнуление лог-файла

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

Если же по какой-то причине к лог-файлу не применяется ротация, и он стал занимать много дискового пространства, то лучше всего не удалять этот файл, а просто обнулить следующим образом:

echo ""> /home/httpd-logs/access.log

Удаление же лог-файла вручную может привести к ряду проблем.

Установка SSH-демона на Windows

Недавно я уже писал о том, как поднять SSH-туннелирование между двумя компьютерами, один из которых работает на Windows (клиент), другой — на Debian (сервер).

Теперь возникла задача создать туннель между компьютерами с установленной ОС Windows. Эта задача чуть сложнее, т.к. в Windows нет встроенного SSH-сервера, чтобы принимать подключения от клиента. Таким образом на компьютер-сервер, который, кстати, у меня работает под управлением Windows Server 2012 Standart, пришлось поднимать SSH-демон. Для решения этой задачи, как и ранее, я использовал Cygwin. Для работы с SSH нужно установить два дополнительных пакета — openssh и openssl.

Далее идет инструкция, как поднять SSH-демон на Windows:

1. Необходимо отредактировать файл Cygwin.bat, добавив в него следующую строку:

set CYGWIN=binmode ntsec

Таким образом батник должен иметь следующий вид:

@echo off

C:
chdir C:\cygwin\bin
set CYGWIN=binmode ntsec
bash --login -i

2. Теперь необходимо убедиться, что Cygwin (cygrunsrv) установлен должным образом. Для этого нужно запустить Cygwin.bat и в открывшемся окне консоли ввести команду:

cygrunsrv -h

Если будет показана справка, то все установленно корректно и можно продолжать дальше. В противном случае нужно будет переустановить Cygwin.

3. Для установки SSH-демона (демон в Windows принято называть службой) нужно выполнить следующую команду:

ssh-host-config

На появляющиеся вопросы следует отвечать следующим образом:

*** Query: Should privilege separation be used? <yes/no>: yes
*** Query: New local account 'sshd'? <yes/no>: yes
*** Query: Do you want to install sshd as a service?
*** Query: <Say "no" if it is already installed as a service> <yes/no>: yes
*** Query: Enter the value of CYGWIN for the deamon: [] binmode ntsec
*** Query: Do you want to use a different name? <yes/no>: yes
*** Query: Enter the new user name: root
*** Query: Reenter: root
*** Query: Create new privileged user account 'root'? <yes/no>: yes
*** Query: Please enter the password:
*** Query: Reenter:

Если конфигурация прошла успешно, то должно быть выведено следующее сообщение:

Host configuration finished. Have fun!

4. Далее нужно выполнить команды:

/bin/mkpasswd -l –u root >> /etc/passwd
mkdir -p /home/root (for example, mkdir -p /home/pjohn)
chown <USER> /home/root

5. В файле C:\cygwin\etc\passwd нужно удалить подобную строку (если есть), которая запрещает пользователю root использовать интерпретатор bash:

root:unused:1005:513:Privileged server,WIN-PC\root,S-1-5-21-38344676178-3524706203-1997156839-1005:/var/empty:/bin/bash/false

6. Выполните следующую команду для запуска SSH-демона (службу можно запустить также из оснастки «Services»):

cygrunsrv -S sshd

7. Убедитесь, что 22 порт открыт для прослушивания (в этом поможет команда netstat -na). Если нет, то необходимо создать соответствующее правило в Windows Firewall.

Теперь можно проверить подключение с клиента:

ssh root@<сервер>

Если все настроенно правильно, то будет выведено приглашение на подключение и ввода пароля.

[Apache] Invalid command ‘SSLEngine’

При опытке перезапустить Apache, выводится ошибка:

# /etc/init.d/apache2 restart

[warn] module rpaf_module is already loaded, skipping
Syntax error on line 303 of /etc/apache2/apache2.conf:
Invalid command 'SSLEngine', perhaps misspelled or defined by a module not included in the server configuration
Action 'configtest' failed.
The Apache error log may have more information.
failed!

Тем не менее модуль присутствует:

# php -m

[PHP Modules]
...
openssl
...

Проблема в том, что модуль неактивирован. Для этого нужно выполнить следующую команду:

# a2enmod ssl

После чего перезапустить Apache.

[Apache] Error retrieving pid file /var/run/apache2.pid

Пробуя зайти на свой сайт, получил 504-ошибку (Gateway Timeout). Полез в консоль, пробую перезапустить Apache, получаю:

Restarting web server: apache2Usage: grep [OPTION]... PATTERN [FILE]...
Try `grep --help' for more information.
Usage: grep [OPTION]... PATTERN [FILE]...
Try `grep --help' for more information.
[Sat Feb 15 18:04:48 2014] [warn] module rpaf_module is already loaded, skipping
(20014)Internal error: Error retrieving pid file /var/run/apache2.pid
Remove it before continuing if it is corrupted.
Action 'stop' failed.
The Apache error log may have more information.
[Sat Feb 15 18:04:48 2014] [warn] module rpaf_module is already loaded, skipping
(20014)Internal error: Error retrieving pid file /var/run/apache2.pid
Remove it before continuing if it is corrupted.
Action 'start' failed.
The Apache error log may have more information.
failed!

Проблема оказалась в том, что логи сожрали все дисковое пространство, оставив жалкие 5 МБ. Удалил логи, пробую опять перезапустить Apache — запустился, но сайт вновь не работает. Перезапускаю сервер — уф, заработало…

Решение проблемы: nginx: [emerg] listen() to 0.0.0.0:80 failed (98: Address already in use)

Сегодня при попытке обновить конфигурацию nginx, вылетела ошибка:

# /etc/init.d/nginx reload

...
nginx: [emerg] listen() to 0.0.0.0:80, backlog 511 failed (98: Address already in use)
nginx: configuration file /etc/nginx/nginx.conf test failed

Ну а когда сделал так:

# /etc/init.d/nginx restart

то с той же ошибкой nginx уже не запустился.

Из описания ошибки следует, что 80-ый порт занят, поэтому nginx не может запуститься:

# netstat -nap | grep 80

tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 4658/apache2
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 488/nginx

Исправляем ситуацию, убив подвисший процесс на 80-ом порту:

# fuser -k 80/tcp

Запускаем nginx:

# /etc/init.d/nginx start

Starting nginx: nginx.

Все.