ubuntu 15.04 и BCM43142

Tags:

После апгрейда Ubuntu 14.04 на Kubuntu 15.04 выяснилось что Wi-Fi на моем ноутбуке работать не хочет от слова "совсем". И если в 14.04 после подключения к интернету он сам предлагал доустановить нужные драйвера - то в 15.04 магия не срабатывала и Wi-Fi не работал.

Симптомы: * в NetworkManager нет даже пункта про беспроводные подключения. * # lshw -c Network говорит что-то вроде:

*-network UNCLAIMED     
   description: Network controller
   product: BCM43142 802.11b/g/n
   vendor: Broadcom Corporation
   physical id: 0
   bus info: pci@0000:02:00.0
   version: 01
   width: 64 bits
   clock: 33MHz
   capabilities: bus_master cap_list
   configuration: latency=0
   resources: memory:90500000-90507fff

Как можно заметить - устройство карте не назначено. Значит надо доустановить пакет с прошивкой для карты. С 14.04 эта карта поддерживается в официальных драйверах, так что просто устанавливаем пакет руками:

sudo apt-get install bcmwl-kernel-source

Перезагружемся и видим в NetworkManager раздел с беспроводными сетями.

Превращаем 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);
Яндекс.Метрика