Превращаем Linux компьютер в AirPlay приемник

Tags:

Захотелось мне как-то играть музыку с мака на колонки без проводов. Раньше для этого я пользовался AirPort Express, куда были воткнуты колонки. Но сия халява кончилась и теперь надо что-то изобретать.

Быстрый поиск по интернетам показал существование демона shairport, который предствляет собой AirPlay приемник для Linux. Проблема в том, что данный демон уже давно не поддерживается и автор прямо отказался от его поддержки. Но благодаря великой силе форков гитхаба был найден проект shairport-sync, который является форком shairport с допилами и поддерживается в настоящее время. То что надо!

Итак, краткий мануал по установке. Я взял старый asus eee 900, на котором стоит xubuntu 14.04LTS. По совместительству он работает у меня домашним сервером.

  • Клонируем к себе репозиторий git clone https://github.com/mikebrady/shairport-sync.git
  • Устанавливаем зависимости нужное для сборки apt install build-essential autoconf checkinstall libtool libdaemon-dev libasound2-dev libpopt-dev
  • Устанавливаем Avahi apt install avahi-daemon libavahi-client-dev
  • Устанавливаем зависимости для работы с SSL apt install libssl-dev. Демон умеет работать с OpenSSL или PolarSSL, но этот пакет нужен для обеих библиотек.
  • Я использовал PolarSSL для сборки, но, в целом, никакой разницы нет. Устанавливаем PolarSSL apt install libpolarssl-dev
  • Запускаем autoconf autoreconf -i -f после этого будет сгенерирован файл configure.
  • $ ./configure --with-alsa --with-avahi --with-ssl=polarssl
  • make
  • sudo checkinstall. Checkinstall задаст несколько вопросов, на них можно ответить по умолчанию, единственное что надо задать поле version в виде числа. Т.к. по умолчанию туда попадает значение sync и checkinstall падает с ошибкой создания пакета.

Почему вместо make install лучше использовать checkinstall? Эта утилита перехватит работу make, отследит куда ставятся все файлы приложения и создаст deb пакет для безопасной установки и удаления приложения.

Конфигурируется демон через редактирования файла /etc/init.d/shairport-sync, я там поменял только название сервиса. Обычно больше ничего не требуется для работы.

Возможные проблемы

При загрузке компьютера может появляться сообщение:

Avahi detected that your currently configured local DNS server serves a domain .local. This is inherently incompatible with Avahi and thus Avahi disabled itself. If you want to use Avahi in this network, please contact your administrator and convince him to use a different DNS domain, since .local should be used exclusively for Zeroconf technology.

Работа Avahi будет останавливаться, соответственно и shairport не запустится. Обычно эта проблема связана с тем, что в DNS сервере есть записи для зоны local.

Проверяется это командой: host -t SOA local. (обратите внимание на точку в конце!). В нормальной ситуации вывод должен быть около такого:

bash-3.2$ host -t SOA local.
Host local. not found: 3(NXDOMAIN)

Если же в выводе написано: local has SOA record XXX, то ваш DNS транслирует зону local. Обычно это делают провайдеры для работы сервисов типа retracker.local. Если вы этим не пользуетесь - можно просто указать днс Yandex (77.88.8.8/77.88.8.1) или Google(8.8.8.8/8.8.4.4).

После этих настроек и рестарта служб - все должно работать, а на устройствах Apple появится ваше устройство для вывода звука.

Remove messages from Graylog2

Tags:

If you want to remove all messages with requested pattern in message body, you have to write following line:

curl -XDELETE 'http://graylog.example:9200/graylog_*/message/_query' -d'{"query" : {"match": { "message" : "SearchPattern"}}}'

remove exact pattern: curl -XDELETE 'http://graylog.example:9200/graylog_*/message/_query' -d'{"query" : {"term": { "message" : "ExactText"}}}'

Используем Graylog с Perl

Tags:

Устанавливаем Graylog. Для опытов я использовал преднастроенную VM для VirtualBox http://docs.graylog.org/en/1.0/pages/installation.html#virtual-machine-appliances

! На момент написания статьи в VM идет версия Graylog-web с багом - при создании dashboard на нее нельзя добавить виджет т.к. JS-скрипт ответственный за разблокировку dashboard падает с ошибкой. Что-бы что-то сделать с дэшбордом на него надо добавить любой виджет с любой страницы. Это делается по клику на иконку возле названия виджета и выбором нужного дэшборда.

Первым делом надо создать Input для логов. Мы будем использовать GELF формат через Log::Log4perl. Идем System->Inputs в выпадающем списке выбираем GELF UDP и жмем Launch Input. В открывшемся окне выбираем ноды на которых будет работать этот инпут, описание, адрес на котором он будет слушать. Жмем launch, убеждаемся что он стартанул и на этом пока все работы с Graylog закончены.

Теперь устанавливаем пакет Log::Log4perl::Layout::GELF.

Создаем файл конфигурации логгера:

log4perl.logger.graylog                     = INFO, Screen, Graylog

log4perl.appender.Screen                = Log::Log4perl::Appender::Screen
log4perl.appender.Screen.stderr         = 0
log4perl.appender.Screen.layout         = Log::Log4perl::Layout::PatternLayout
log4perl.appender.Screen.layout.ConversionPattern = [%d] [%p] %m%n
log4perl.appender.Screen.utf8           = 1

log4perl.appender.Graylog          = Log::Log4perl::Appender::Socket
log4perl.appender.Graylog.PeerAddr = graylog.host
log4perl.appender.Graylog.PeerPort = 12201
log4perl.appender.Graylog.Proto    = udp
log4perl.appender.Graylog.layout   = GELF

Создаем тестовый скрипт:

#!/usr/bin/env perl

use utf8;
use strict;
use Log::Log4perl;

#Загружаем конфигурацию 
Log::Log4perl::init('logger.conf');

#Получаем логгер
my $logger = Log::Log4perl->get_logger('graylog');

$logger->info('hello graylog');
$logger->info('Тестовое сообщение UTF8');

В теории, этого достаточно для того что бы нужные логи вашего приложения начали идти в Graylog. Но, как обычно, есть нюанс - этот модуль совершенно не представляет что есть более чем однобайтные кодировки и при попытке что-то записать в лог что-то с utf8 мы получим ошибку Wide character in IO::Compress::Gzip::write и в Graylog сообщение не придет.

Для обычных аппендеров, например Screen, эта проблема решается просто - дописываем в конфигурацию флаг включения utf8:

log4perl.appender.FileAppndr.utf8     = 1

Но в данном случае проблема на уровне layout и этот модуль не обрабатывает такую ситуацию.

Для себя я эту проблему решил просто - сделал форк модуля с названием GELFUtf и использую его.

Таким образом в конфиге вместо log4perl.appender.Graylog.layout = GELF пишу log4perl.appender.Graylog.layout = GELFUtf.

Подменить фунцию на лету у меня не получилось, скорее всего из-за хитрой архитектуры Log4perl. А лезть патчить в рантайм - овчинка выделки не стоит. Так что пока пользуюсь патченым модулем и коплю силы на создание полноценного патча для оригинального модуля.

stdout autoflush

Tags:

Классический метод:

$oldfh = select(STDERR); $| = 1; select($oldfh);

ООП:

use IO::Handle;
STDERR->autoflush(1);

Ubuntu 14.04 + Gearman

Tags:

В базовой установке Gearman в ubuntu 14.04 есть баг - инит-скрипт написан не правильно и в результате Gearman не реагирует наличие конфиг файла и запускается с настойками по умолчанию. Причем, на одном из серверов у меня проблемма после обновления усугубилась и он перестал запускаться даже с настройками по умолчанию.

Есть два варианта решения проблемы:

  1. Пропатчить инит-скрипт, как это сделать можно прочитать здесь
  2. Запускать его из под supervisord.

У меня все приложения крутятся под supervisor, так что я пошел этим путем.

Минимальный конфиг файл для супервизора:

[program:gearmand]
command=/usr/sbin/gearmand -L 127.0.0.1 --user=gearman --log-file=stderr
autorestart=true
autostart=true

-L 127.0.0.1 указано, во первых, что-бы gearman не биндился на внешние интерфейсы (там все закрыто фаирволом, но все же). Во вторых - если на машине включен ipv6, но не настроен, то gearman будет пытаться забиндиться и на ipv6 и падать.

З.Ы. инит для supervisord в 14.04 тоже кривой, но это уже другая история.

Яндекс.Метрика