среда, 29 августа 2012 г.

Как получить доступ к серверу через SSH, имея только виртуальный FTP аккаунт

Сегодня попался довольно интересный случай в саппорте, где пришлось отлаживать работу приложения на PHP, имея только виртуальный FTP аккаунт. В качестве примера я буду называть сайт www.example.com и FTP аккаунт supportuser@example.com, ограниченный корневой директорией исходников сайта. Сервер, на котором расположен сайт, работает под управлением WHM/cPanel.

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

пятница, 24 августа 2012 г.

Сборка недостающих модулей ядра для платформы Android

Давненько мне хотелось попробовать себя в сборке модулей ядра для моего телефона на базе Android. Вчера мне потребовался OpenVPN, но для его работы нужен модуль tun/tap, который отсутствует в моей прошивке. Поискав по маркету я нашел приложение TUN.ko Installer, которое позволяет установить модуль нужной вам версии, если такой есть в репозитории проекта. Но поскольку спать еще не хотелось, и простых решения я не искал, то было решено собрать модуль самостоятельно.

пятница, 27 июля 2012 г.

Workflow: SSL сертификаты

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

Для себя я выделяю несколько этапов в жизненном цикле SSL сертификата:
  • создание SSL сертификата
  • установка SSL сертификата
  • мониторинг валидности и срока окончания SSL сертификата

пятница, 13 июля 2012 г.

Создание бинарного пакета с debug-символами в debian

Переодически приходится сталкиваться с ошибками в программах, которые приводят к их аварийному завершению. Типичный пример такой ошибки - завершение по сигналу SEGFAULT. Чтобы выяснить в каком месте и при каких условиях программа завершилась нужны отладчик и отладочные символы для исследуемой программы.

В моем случае это был tinymount, который я когда-то пакетировал ради интереса и сейчас наткнулся на ошибку в его новой версии. В моем варианте пакета отладочные символы были исключены и я добавил пару изменений в debian/control, debian/rules (сделал на примере отсюда) чтобы их получить.

$ echo >> debian/control << EOF

Package: tinymount-dbg
Architecture: any
Section: debug
Priority: extra
Depends: tinymount (= ${binary:Version}), ${misc:Depends}
Description: debugging symbols for tinymount
 Tinymount is a simple UI tool to mount/unmount disks using UDisks.
 .
 This package contains the debugging symbols for tinymount.
EOF

$ echo >> debian/rules << EOF
DEB_DESTDIR := $(CURDIR)/debian/tinymount
EOF

После чего увеличил версию пакета:

dch -v '0.2.5~pre-2' 'Added debug symbols'

и собрал его

$ debuild -us -uc

В отчете lintian (его запускает debuild после окончании сборки) помимо отсутствующей страницы man для tinymount была ругань на "пустой пакет" tinymount-dbg. Он оказался почти пустым, т.к. отладочных символов в нем действительно не было.

Дальше было больше часа попыток нагулить причину. Но озарение пришло только после вдумчивого чтения логов сборки пакета (логи рулят!). При выполнении цели install в сгенеренном qmake'ом Makefile'е выполнялся strip для инсталируемого бинарника. Вот потому dh_strip и не находил никаких отладочных символов.

Немного порывшись в документации на qmake, я добавил в debian/rules к параметру DEB_QMAKE_ARGS значение CONFIG+=debug. После этого пересборка пакета и символы появились как и ожидалось.

четверг, 5 июля 2012 г.

Maintenance page для сайтов, которые обслуживаются Apache

Я уже писал про maintenance page для сайтов, которые обслуживаются Nginx, а сегодня добавлю пример такой страницы для Apache.

Содержимое страницы maintenance.html остается прежним:

<html>
<head>
<title>Server Maintenance</title>
</head>
<body>
<center>
<h1>Server maintenance</h1>
Our apologies for the temporary inconvenience. The page is temporarily unavailable as server is down for scheduled maintenance. We will be back soon.
</center>
</body>
</html>
/var/www/maintenance/maintenance.html

Чтобы Apache выдавал страницу с кодом 503, нужно немного доработать .htaccess:

ErrorDocument 503 /maintenance.html 

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteCond %{REQUEST_URI} !^/maintenance.html$
    RewriteCond %{REMOTE_ADDR} !1.2.3.4
    RewriteRule .* /maintenance.html [R=503,L]
</IfModule>
/var/www/maintenance/.htaccess

После этого maintenance страницу будет показывать всем кроме тех, кто заходит на сайт с ip 1.2.3.4.

суббота, 30 июня 2012 г.

DEADBEEF 0.5.5

Уже прошел почти месяц с тех пор, как был анонсирована новая версия плеера DEADBEEF 0.5.5. Список изменений у новой версии довольно впечатляющий, хотя по сути все это исправления существующих ошибок.

changelog since 0.5.4

  • fixed converter GUI plugin crash if the converter plugin not found
  • fixed compiling on FreeBSD
  • fixed race condition bug in streamer
  • fixed flac embedded cover loading bug
  • fixed multiline tag field editing
  • fixed vorbis streaming audio bug
  • fixed numlock handling in global hotkeys setup
  • fixed KP_Return not working
  • fixed filename being ignored in the search window
  • fixed session saving on reboot/logout using XSMP via eggsmclient
  • fixed few missing translation strings
  • fixed many instability issues caused by improper use of pl_find_meta[_raw] calls
  • fixed improper use of GtkStyle in playlist and tabs widgets
  • fixed prev/next handling when playback is stopped
  • fixed random playback bug caused by libsidplay2 calling srand(time(NULL))
  • fixed crash in adplug when playing ADL files
  • fixed crash in aac reload metadata
  • fixed Grandia - Parallel Trippers.gbs crash in GME plugin
  • fixed crash in GME plugin when a file doesn't exist
  • fixed integer overflow bug in float32->int32 conversion
  • fixed m3u parser string copy bug
  • fixed several dsp bugs in the converter
  • fixed up/down buttons in the converter's dsp preset editor
  • fixed selected row bugs in dsp preset editors in gtkui preferences and converter
  • fixed parent window of dsp plugin configure window
  • fixed all known issues in gtk3 plugin -- it should be fully working now
На этой неделе в блоге появился комментарий, где спрашивали буду ли я поддерживать обновление версий deadbeef в своем репозитарии. На тот момент я отписался, что буду это делать, если в этом будет смысл, поскольку проект собирает бинарные пакеты, пригодные для Debian/Ubuntu.

Уже позже, вечером, я начал ковырять пакет, который готовит апстрим, чтобы сравнить его с моей последней сборкой (у меня была только версия 0.5.2 в репозитарии). ИМХО недостатки официального пакета:
  • устанавливается в /opt/deadbeef, но не делает ссылку на бинарник в /usr/bin (нет возможности запустить из консоли не прописав полный путь);
  • не работает pause toggle при клике средней кнопкой на иконку deadbeef в трее (в принципе не критично, если настроены глобальные комбинации);
  • не работает регулировка громкости, если прокручивать колесо мыши над иконкой deadbeef в трее;
  • недостающие recommended зависимости приходится ставить руками (поскольку пакет ставится не через APT, то установка проходит нормально, но при запуске пакет ругается в консоли - у меня к примеру не стояли libcddb2 и libzip1).
В принципе ничего критичного нет, но похоже большинство привыкло получать обновления из APT. Потому я зарядил новую подсистему своего buildbot'а на сборку пакета 0.5.5 под Debian/Ubuntu.

В итоге сейчас пакет доступен для:
  • Debian: Squeeze, Wheezy, Sid (i386, amd64);
  • Ubuntu: Maverick, Lucid, Oneiric, Natty, Precise (i386, amd64).
Чтобы добавить себе мой репозитарий, смотрите инструкции тут.

пятница, 29 июня 2012 г.

Увеличение числа одновременно открытых файлов в MySQL сервере

Сегодня довелось решать проблему с превышением лимита одновременно открытых файлов у MySQL сервера. Ошибка, которая свидетельствует о такой проблеме выглядит так:

MySQL Error: Out of resources when opening file './db_name/table_name.MYD' (Errcode: 24)

Поскольку все коды ошибок я на память не помню, то первым делом заглянул в вывод perror:

$ perror 24
OS error code  24:  Too many open files

Смотрим сколько разрешено открывать файловых дескрипторов пользователю mysql (пользователь, с правами которого работает MySQL сервер).

$ sudo su - mysql -c 'ulimit -n'
1024

Далее смотрим, сколько дескрипторов разрешено в MySQL:

$ mysql -se "show variables like 'open_files_limit'"
Variable_name       Value
open_files_limit    1024

Увеличим лимит в 4 раза, до 4096:

$ echo 'mysql  -  nofile  4096' | sudo tee -a /etc/security/limits.d/mysql.conf
$ sudo su - mysql -c 'ulimit -n'
4096

Если лимит не изменился, то нужно посмотреть где подключен pam_limits.so в конфигурации PAM.

$ grep -r limits /etc/pam.*
/etc/pam.d/sshd:session    required     pam_limits.so
/etc/pam.d/atd:session    required   pam_limits.so
/etc/pam.d/login:session    required   pam_limits.so
/etc/pam.d/sudo:session required pam_limits.so
/etc/pam.d/cron:session    required   pam_limits.so
/etc/pam.d/su:# session    required   pam_limits.so

Для Debian нужно добавить строку session required pam_limits.so в /etc/pam.d/common-session

$ echo 'session required pam_limits.so' | sudo tee -a /etc/pam.d/common-session

Осталось поправить конфиг MySQL, чтобы сервер начал использовать новый лимит. Для этого в my.cnf в секцию [mysqld] добавляем строчку

open_files_limit = 4096