среда, 28 января 2015 г.

CVE-2015-0235 - обновляйте свои хосты

В glibc нашли новую критическую уязвимость (CVE-2015-0235), которую можно использовать удаленно. Сегодня у меня день обновлений.

пятница, 23 января 2015 г.

Не работает dnssec-validation в bind9 в Ubuntu Precise

Столкнулся с багом в Ubuntu 12.04 LTS (Ubuntu Precise) - bind9, настроенный в качестве кеширующего dns, не может резолвить некоторые хосты. При этом в лог падает ошибка вида:

named[10137]: validating @0x7fa7cc019410: mail.frogger.nl A: got insecure response; parent indicates it should be secure
named[10137]: error (insecurity proof failed) resolving 'mail.frogger.nl/A/IN': 66.96.80.194#53
named[10137]: error (no valid NSEC) resolving 'mail.frogger.nl/A/IN': 85.17.41.33#53
named[10137]: error (no valid NSEC) resolving 'mail.frogger.nl/A/IN': 82.192.67.204#53

Проверка этого хоста на DNSSEC Analizer не показала никаких проблем. Если верить гуглу - я не одинок и проблема возникает с резолвингом хостов, где используется комбинация wildcard (*.frogger.nl, под который и попадает mail.frogger.nl) и DNSSEC. Соответствующие баг репорты открыты в Ubuntu #1203976 и Debian #690569.

В качестве затычки пока выключил валидацию dnssec:

options {
    dnssec-validation no; //was "dnssec-validation auto;"
}

Я пробовал сравнивать работу bind9 одинаковой версии (1:9.8.1.dfsg.P1-4) в Ubuntu и Debian: в Debian хост резолвится, а в Ubuntu - нет. Сравнение исходников пакета из Ubuntu и Debian не показывает никакой разницы. Пересборка пакета для Ubuntu тоже не улучшила ситуацию...

Возможно кто-то знает, почему один и тот же пакет bind9 по-разному ведет себя в Debian и Ubuntu?

четверг, 22 января 2015 г.

Если вам приходится тестировать сайты в IE 6-11

Наткнулся на полезный ресурс: modern.ie, позволяющий загрузить готовые образы виртуальных машин с IE 6-11 и соответствующей версией Windows. Для Linux есть поддержка VirtualBox.

Лицензионное соглашение позволяет использовать эти виртуальные машины только для тестирования сайтов в IE, но и это аттракцион необычайной щедрости от Microsoft.

Что будет если в нескольких вкладках браузера запустить один и тот же скрипт?

Наткнулся на интересный момент, который связан с работой браузеров. Имеется PHP скрипт у которого есть защита от одновременного запуска нескольких копий через flock()

<?php
$fp = fopen($_SERVER['SCRIPT_FILENAME'], 'r');

if (flock($fp, LOCK_EX | LOCK_NB)) {
    echo 'Job started' . PHP_EOL;
    sleep(10);
    flock($fp, LOCK_UN);
} else {
    echo 'Another job already running' . PHP_EOL;
}

fclose($fp);
?> 

Такой код обеспечивает надежную блокировку от одновременного запуска нескольких копий задания на уровне процесса. Но при тестировании оказалось, что если этот скрипт запустить в нескольких вкладках одного браузера, то вместо быстрого завершения с выводом 'Another job already running' вкладки последовательно срабатывали, выводя 'Job started'. Но этого быть не должно, ведь используется неблокирующий вызов flock()!

Для проверки запустил несколько запросов, через wget

$ for i in $(seq 1 5); do wget -q -O- http://localhost/flock.php & done
[1] 30876
[2] 30877
[3] 30878
[4] 30879
[5] 30880
$ Another job already running
Another job already running
Another job already running
Another job already running
Job started

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

Я не знаю точно, почему так происходит, но возможно дело в кеше браузера. Когда URL запрашивается в первый раз он помечается в кеше как pending, пока не будет ответа от сервера. Последующие запросы того же URL в других вкладках натыкаются на незавершенную операцию и ожидают - ведь возможно удастся выдать результат, используя кеш. Когда отрабатывает первый запрос, браузер видит ответ сервера, запрещающий кеширование результата и запускает второй запрос. Таким образом все запросы выполняются последовательно, успешно получая блокировку. Завтра нужно будет проверить, действительно ли только один запрос выполняется сервером одновременно.

вторник, 20 января 2015 г.

HTPC своими руками (часть 3)

Это третья, заключительная, часть цикла постов о самостоятельной сборке HTPC (первая и вторая части). В предыдущих частях я рассказывал о "железной" и программной начинке, а также слегка коснулся истории моего HTPC-строения. В этой части я опишу интеграцию HTPC с сервисом IPTV от провайдера Атлант Телеком.

Мой тарифный план от интернет-провайдера включает пакет каналов IPTV, сейчас этот пакет включает более 70 каналов, в том числе один в HD качестве. Плейлист для IPTV плеера находится тут (доступен только из сети Атлант Телекома).

Для просмотра IPTV провайдер предлагает использовать либо программный плеер (для просмотра ТВ на компьютере), либо цифровую приставку STB MAG250 Micro.

STB MAG250 Micro

Эта цифровая приставка используется многими IPTV провайдерами, но не подходила мне, т.к. на тот момент вся сеть была на базе wifi, а не ethernet. Мои первые попытки смотреть IPTV через wifi, используя для этого multicast, заканчивались зависанием или перезагрузкой точки доступа уже через секунд 15-20 просмотра. Через ethernet-кабель, приходящий от провайдера, IPTV работал нормально. Чтобы решить эту проблему нужно преобразовывать multicast трафик в unicast. К тому моменту я уже немного игрался с tvheadend, так что вместо экспериментов с udpxy и прочими поставил его. Установка для Debian Wheezy проста

$ wget -O- http://apt.tvheadend.org/repo.gpg.key | sudo apt-key add -
$ echo 'deb http://apt.tvheadend.org/stable wheezy main' | sudo tee /etc/apt/sources.list.d/tvheadend.list
$ sudo apt-get update
$ sudo apt-get install tvheadend

При установке у вас попросит задать логин и пароль администратора, которые вам пригодятся чтобы зайти в настройки Tvheadend. Для этого вам нужно в браузере перейти по адресу http://server-ip:9981/. Свежеустановленный Tvheadend выглядит как-то так


Первый раз я скрупулезно выполнил мартышкин труд и создал в Tvheadend'е более 70 каналов, включил в XBMC плагин tvheadend pvr и настроил подключение к серверной части. После небольшой паузы (на тот момент у меня был еще HTPC на базе Raspberry PI) появилась картинка и звук на телевизоре. Я прошелся по каналам и обнаружил что для некоторых есть только звук, а вместо картинки - черный экран. Расследование показало, что проблемные каналы вещаются в MPEG2, а работающие в H264. Гугление привело меня на страницу покупки лицензионных ключей для аппаратного декодера Rapsberry PI. Дело в том, что декодирование MPEG-2 и VC-1 требует отчисление роялти и потому заблокировано по-умолчанию. Чтобы не заморачиваться в будущем я купил сразу ключи для MPEG-2 и VC-1. После прописывания ключей в загрузчик Raspberry и перезагрузки заработали и "проблемные" каналы.

Недоставало только программы передач (EPG) для работы записи по расписанию. Для MythTV я использовал программу передач с сайта teleguide.info и все было замечательно, но однажды на этом сайте появилось уведомление, что сервис закрывается - пришлось искать альтернативы.

Атлант Телеком предоставляет программу передач в формате JTV (http://help.telecom.by/_files/TelecomTV/TelecomTVepg.zip), но Tvheadend поддерживает только формат XMLTV. Попробовал покопаться в содержимом файлов EPG провайдера - мое внимание привлекла запись, которая присутствовала в начале каждого файла с расширением .pdt (сейчас этой записи уже нет)


В названии каждой первой передачи была вставка
-- Телепрограмма с сайта: www.vipiko.tv --
Зайду-ка я на этот сайтик. Bingo! На этом сайте выложена программа передач не только в формате JTV, но и нужном мне XMLTV. Похоже Атлант Телеком просто собирает в архив нужные каналы, не особо заботясь о "чистке". Подключив этот сервис к Tvheadend, я пользовался им примерно год и прекратил, когда после очередной "отмены времени" в РФ, для многих каналов смещение времени стало неверным. К этому времени выяснилось, что teleguide.info толи восстал из пепла, то ли не до конца помер - теперь пользуюсь им.

На этом можно было бы и закончить рассказ, если бы Атлант Телеком слишком часто не менял каналы IPTV. Приходилось отслеживать изменения и перенастраивать Tvheadend. Вскоре делать это надоело и я написал утилиту tvheadend-iptv-damavik, которая заботится об актуальности настроек каналов и импорте EPG.

понедельник, 19 января 2015 г.

Dell Latitude E6430: Incorrect partition table!

Обновил свой ноутбук до Dell Latitude E6430 (был E6410). Чтобы не заморачиваться с переносом системы, просто переставил SSD диск из старого ноутбука в новый и столкнулся с ошибкой при загрузке системы
Incorrect partition table!
Если нажать Enter, то загрузка продолжится и появится меню Grub 2. Ошибка связана с тем, что ни один из разделов не помечен как загрузочный. Для решения проблемы достаточно отметить раздел /dev/sda1 (/boot) как загрузочный.

понедельник, 12 января 2015 г.

HTPC своими руками (часть 2)

В первой части я рассказывал про аппаратную начинку своего HTPC. Теперь пора рассказать про его программную составляющую.

В самом начала HTPC-строения я использовал MythTV, серверная часть которого была установлена на обычном десктопе, а клиенты на том же компьютере и ноутбуке.


MythTV использовал аналоговый тв-тюнер (Beholder 507 FM), что давало возможность записывать интересные передачи с кабельного тв и смотреть их в удобное время на любом компьютере. Этот тюнер замечательно поддерживается в Linux, а его пульт дистанционного управления поддерживается LIRC.

Позже в одном из обновлений MythTV сломали работу с аналоговыми тюнерами и не спешили чинить, так что пришлось искать альтернативу. Еще один недостаток этого решения - записывать можно было только одну передачу одновременно, ведь тюнер может быть настроен только на один канал. Это ограничение можно было обойти добавив второй тюнер, но от этого апгрейда я отказался. Из положительных моментов - поддержка записи по расписанию, timeshift (вы можете поставить телепередачу на паузу и сходить за чаем) и пропуск рекламных блоков (не всегда определяло правильно).

С появлением Raspberry PI я начал миграцию своего HTPC на эту платформу. К сожалению использовать MythTV на Raspberry PI не получится, так как у него нет поддержки аппаратных декодеров, а на программную обработку не хватит ресурсов. В процессе поиска альтернативы для MythTV я пришел к XBMC (сейчас он уже называется Kodi, но поскольку версия, установленная у меня еще называется XMBC, то дальше я буду называть его по-старому).


Для raspberry pi есть несколько дистрибутивов с поддержкой XBMC - я точно помню что тестировал Raspbmc, OpenELEC и Raspbian. Наиболее стабильным и простым в установке оказался OpenELEC - дальше я работал только с этим дистрибутивом. У Raspberry PI есть поддержка CEC, которую я обнаружил совершенно случайно. Оказалось очень удобным, но на моем телевизоре LG работали только базовые функции вроде play/pause, stop, forward, rewind, next, previous и крестовина навигации (up, down, left, right). Чтобы заработал CEC, нужно включить поддержку SimpLink в телевизоре (в других телевизорах эта фича называется по-другому). В принципе этого хватало, а расширенное управление выполнялось со смартфона через Official XBMC Remote.

Поскольку Raspberry PI уже не используется, то дальнейшее описание приводится для HTPC на базе Gigabyte GB-XM14-1037. Установка очень проста - скачиваем дистрибутив с сайта OpenELEC и готовим установочный диск (в моем случае это флешка /dev/sdd). Будьте внимательны при выполнении этих команд - вы можете испортить содержимое другого диска.

$ wget -P /tmp http://releases.openelec.tv/OpenELEC-Generic.x86_64-4.2.1.tar
$ cd /tmp
$ tar -xf OpenELEC-Generic.x86_64-4.2.1.tar
$ cd OpenELEC-Generic.x86_64-4.2.1
$ sudo ./create_installstick /dev/sdd

Для начала установки нужно загрузить HTPC с созданной флешки. Сам процесс установки очень прост и состоит из далее, далее, далее...

Первая же загрузка показалась просто мгновенной в сравнении со старым вариантом на базе raspberry pi. Сказывается более мощный процессор и скорость ssd диска. Осталось подключить ресурсы домашней сети: фотографии, видео и IPTV от АтлантТелеком. Домашний сервер раздает ресурсы через Samba и NFS - поддержка обоих протоколов есть в XMBC.

Для поддержки IPTV на сервере установлен Tvheadend, который принимает multicast траффик и преобразует его в unicast - раньше сеть работала через wifi и это было необходимо. Сейчас HTPC подключен через ethernet, но менять что-то не вижу смысла. В следующей части я опишу особенности настройки Tvheadend в сети АтлантТелекома - возможно это кому-то пригодится. Tvheadend поддерживает запись по расписанию, timeshift и web клиент (нужен установленный плагин vlc).

Из плагинов установлен только Yahoo weather (для прогноза погоды), Youtube (для просмотра отложенного видео), tvheadend pvr клиент и retroarch для поддержки эмуляции старых консолей. С retroarch пришлось повозиться, т.к. версия для xbmc не устанавливается на 4.2.1. Я перепробовал много разных сборок, пока не нашелся рабочий вариант. После установки плагина нужно настроить соответствие кнопок gamepad'а и эмулятора. Мне пришлось пожертвовать одной из кнопок select, чтобы сохранился доступ к меню retroarch. Осталось скопировать rom-файлы в ~/emulators/retroarch/rom/ и насладиться игровым процессом. Как же мне не хватало возможности сохраниться в том же Comix Zone на сеге!

Пару слов о костылях, которыми пришлось поправлять некоторые моменты. Самым неприятным была случайная попытка выключить телевизор не тем пультом. При нажатии на "power" на пульте от HTPC последний без лишних вопросов выключался, а чтобы его включить приходилось нащупывать кнопку включения за телевизором. Эта проблема была решена радикально - я просто отключил реакцию на событие в конфигурации XBMC

$ cat ~/.xbmc/userdata/keymaps/remote.xml 
<keymap>
  <global>
      <remote>
          <power>NOOP</power>
      </remote>
  </global>
</keymap>

Вторым неприятным моментом было отсутствие повторения нажатия для Volume Up/Down и выражалось в невозможности быстро уменьшить или увеличить звук. Поиск в интернете навело меня на маленький скрипт, который решает эту проблему.

$ cat ~/volume.py
import json, sys, xbmc
step = 10
if sys.argv[1] == 'down':
    step *= -1
rpc = '{"jsonrpc": "2.0", "method": "Application.GetProperties", "params": {"properties": ["volume"]}, "id": 1}'
vol = json.loads(xbmc.executeJSONRPC(rpc))["result"]["volume"]
xbmc.executebuiltin('SetVolume(%d,showVolumeBar)' % (vol + step))

Теперь нужно повесить вызов этого скрипта в качестве обработчика VolUp/VolDown. Добавляем в файл ~/.xbmc/userdata/keymaps/remote.xml секцию

<keymap>
  <global>
      <remote>
          <volumeplus>RunScript("/storage/volume.py", "up")</volumeplus>
          <volumeminus>RunScript("/storage/volume.py", "down")</volumeminus>
      </remote>
  </global>
</keymap>

Теперь регулировка уровня звука идет с шагом 10%, если нужно меньше, то измените значение "step = 10" в файле ~/xbmc-volume.py.

пятница, 9 января 2015 г.

HTPC своими руками (часть 1)

Отпуск подходит к концу - нужно сделать хоть что-то полезное. Поэтому решил описать свой домашний мультимедиа комбайн aka HTPC, представляющий собой замену телевизора (IPTV), видео плеера, винтажную игровую приставку и еще много чего по мелочи.

Hardware

Предыдущая версия HTPC была на базе Raspberry PI (Model B), но постепенно аппетиты выросли и я сделал апгрейд на Gigabyte GB-XM14-1037.


Этот баребон поставляется без оперативной памяти и SSD накопителя. Планку памяти DDR3 Samsung на 2GB я планировал использовать из загашника (осталась после апгрейда ноутбука), а в качестве SSD диска я докупил Kingston 30GB в формате mSATA.

В комплекте баребона есть адаптер на крепление VESA 75x75 или 100x100, но мой телевизор рассчитан на крепление VESA 200x100, так что еще придется поискать переходник 200x100 на 100x100.

При первом включении новой системы вышел конфуз - загорелся индикатор включения, но телевизор жаловался на отсутствие сигнала. В интернете хватает описаний схожих проблем и различных решений, но лично мне помогло сменить планку памяти - имейте это ввиду, если соберетесь брать себе аналогичную систему. В системе нет средств диагностики вроде спикера, так что пришлось решать проблему методом научного тыка. Сейчас там стоит планка DDR3 Kingston на 4GB и все работает нормально.

Итого получалась конфигурация:

CPU: Intel Celeron 1037U @ 1.80GHz
RAM: 4GB
SSD: 30GB
Network: WiFi, Ethernet 10/100/1000Mbit/s

В Raspberry PI была встроенная поддержка CEC (SimpLink в терминологии LG) - это давало возможность использовать пульт от телевизора для управления системой. Чтобы пользоваться CEC в новой железке можно было прикупить USB CEC Adapter от Pulse Eight, но платить больше 50$ за эту возможность мне запретило внутреннее земноводное.


Взамен был куплен MCE-совместимый пульт управления. Из недостатков - невозможность управления включением/выключением телевизора с этого пульта (думаю решить эту проблему либо универсальным пультом, либо самопальным конвертером IR сигнала), а также настройка уровня звука в самом телевизоре (иногда нужно).

Чтобы порадовать своего внутреннего ребенка, я добавил эмуляцию старых игровых приставок (Dendy, GBA, Sega Mega Drive, и т.д.). Для этого был приобретен самый простой геймпад, который нашелся в ближайшем компьютерном магазине.

Им оказался Gembird JPD-ST02 - два спаренных геймпада на один USB порт, последнее важно поскольку у HTPC только 2 USB порта и один уже занят приемником пульта управления (ставить USB хаб мне не хочется). В Linux геймпад определяется без проблем и даже работает Force Feed Back.

Вот вроде и все, что касается железа. В следующей части расскажу про программную часть.