суббота, 6 декабря 2014 г.

Не знаете чем занять детей - предложите им снять мультфильм

Сегодня с самого утра присматриваю за детьми. Детишки приболели, потому на улицу без надобности вести их не хочется. Чем занять детей, когда игрушки уже надоели, книжки прочитали, а солнце еще высоко? Поскольку я противник зомбирования детей бесконечным просмотром мультиков, то предложил детям вместо просмотра мультиков попробовать снять наш собственный.

Для простоты и наглядности решил попробовать снять мультик в формате stop motion. В репозитарии Debian есть пакет stopmotion, который как раз для этого и предназначен.

Детишки провели короткий кастинг среди игрушек и выбрали двух персонажей. Еще пару минут ушло на подключение веб-камеры и настройку освещения.

Камера, мотор, начали! Отснять 7 секунд видео, озвучить и свести звук и видео воедино заняло примерно час. Вот, что у нас получилось:


Время пролетело незаметно и дети остались в полном восторге. Теперь на столе стоит целая очередь на новый кастинг - посмотрю как долго хватит запала заниматься этим.

Для создания анимации были использованы:
  • stopmotion - создание анимации
  • audacity - озвучка
  • avidemux - сведение звука и видео воедино (у stopmotion есть возможность добавлять звук, но он не экспортируется в видео)

суббота, 29 ноября 2014 г.

Network Manager: Disable wireless if wired connection available

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

Network Manager в Wheezy (а возможно и более новые версии) не умеет отключать беспроводное подключение, когда доступно проводное. Чтобы беспроводное подключение не мешало проводному я отключил автоматическое подключение к домашней точке доступа. Но в этом случае появляется необходимость каждый раз вручную подключаться к точке доступа. Так работало довольно долго, но сегодня я какой-то особенно ленивый и потому решил автоматизировать этот момент.

Одно из средств расширения функциональности Network Manager - dispatcher скрипты. Скрипт /etc/NetworkManager/dispatcher.d/50wired-xor-wireless, управляющий логикой подключения

#!/bin/sh

IFACE="$1"
ACTION="$2"

if [ ! -x "$(which nmcli 2>/dev/null)" ]; then
    exit 0
fi

case ${IFACE} in
    eth*)
        case ${ACTION} in
            up)
                nmcli nm wifi off
                ;;
            down)
                nmcli nm wifi on
                ;;
        esac
        ;;
esac

Чтобы NetworkManager использовал новый скрипт он должен иметь определенные права

chown root:root /etc/NetworkManager/dispatcher.d/50wired-xor-wireless
chmod 0755 /etc/NetworkManager/dispatcher.d/50wired-xor-wireless

Теперь при подключении ethernet-кабеля отключается wifi, а при отключении кабеля - wifi включается обратно. Воистину лень - двигатель прогресса.

пятница, 28 ноября 2014 г.

500 OOPS: vsftpd: refusing to run with writable root inside chroot()

Тестируя апгрейд одного из серверов со Squeeze до Wheezy я столкнулся с невозможностью зайти на сервер по FTP. В качестве FTP сервера используется vsftpd с поддержкой виртуальных пользователей.

При попытке зайти через lftp выдается невнятная ошибка TLS

$ lftp admin@example.com
lftp admin@example.com:~> dir
ls: Фатальная ошибка: gnutls_record_recv: An unexpected TLS packet was received.

Выключаю поддержку SSL и пробую снова

ls: Ошибка регистрации: 500 OOPS: vsftpd: refusing to run with writable root inside chroot()

После чтения /usr/share/doc/vsftpd/FAQ.gz стало ясно, что это сделано специально
Q) Help! I'm getting the error message "refusing to run with writable root".
A) vsftpd is protecting against dangerous configurations. The cause of this
message is usually dodgy ownership of the ftp home directory. The home
directory should NOT be owned by the ftp user itself. Neither should it
be writable by the ftp user. A way to fix this is:
chown root ~ftp; chmod -w ~ftp
Another cause might be an attempt to use chroot_local_user without setting up
the directory ownership properly.
Попробовал добавить опцию "allow_writeable_chroot=YES", но версия vsftpd в Wheezy ее не знает.

В качестве решения пересобрал пакет из Sid и выложил в репозитарий.

вторник, 25 ноября 2014 г.

Быстрая очистка всех логов в Windows

Чтобы быстро очистить все логи в Windows нужно выполнить в консоли с правами администратора команду

for /F "tokens=*" %1 in ('wevtutil.exe el') DO wevtutil.exe cl "%1"

Проверено на Windows 7. Подробнее здесь.

понедельник, 24 ноября 2014 г.

Рекомендую прочесть: The Martian

На прошлой неделе засел за чтение The Martian (Andy Weir). Не припомню кто мне ее порекомендовал, но я ни разу не пожалел, что начал читать эту книгу.

Поклонники научной фантастики не останутся равнодушными к истории выживания человека, оставшегося в одиночестве на мертвой планете.

четверг, 13 ноября 2014 г.

Куда сообщить о неработающем светофоре в Минске

Пару дней назад на перекрестке ул. Прушинских и Игуменского тракта в Минске перестала работать дополнительная секция светофора (стрелка налево), который расположен ближе к МКАД. Там есть дублирующий светофор, но его не всегда видно когда стоишь вторым-третьим.

Еще вчера вечером эта секция не работала и я задался вопросом - а кого нужно тормошить, если не работает светофор? Сначала думал позвонить в ГАИ и узнать, но потом наткнулся на статью.

Сообщить о неработающем светофоре, испорченных или отсутствующих дорожных знаках, неверно нанесенной разметке вы можете, позвонив в КУП "СМЭП Мингорисполкома" по стационарному телефону: 8 (017) 373-36-83 (городской), мобильным телефонам 8 (029) 630-12-48 (Velcom), 8 (029) 874-48-63 (МТС).

Время приема сообщений: с 07.00 до 23.00.

Оставляя свое сообщение, указывайте точное месторасположение "проблемной точки" и свои контактные данные.

Заявку приняли - посмотрим как быстро они устраняют проблемы.

P.S. Светофор отремонтировали в тот же день (судя по всему отремонтировали его по плану или по другой заявке, т.к. уже через час-два все работало).

понедельник, 10 ноября 2014 г.

KES10: Error 1723.There is a problem with this Windows Installer package.

При попытке удалить антивирус Kaspersky Endpoint Security 10 столкнулся с ошибкой:
Error 1723.There is a problem with this Windows Installer package. A DLL required for the installation to complete could not be started. Contact Technical Support or the package vendor. Action KLSETUPDIR_Set, entry: SetSetupDir, library: C:\Users\TATARA~1\AppData\Local\Temp\MSI2F5C.tmp
Пробовал сбросить права на C:\Users\TATARA~1\AppData\Local\Temp, но не помогло. В итоге получилось запустить удаление антивируса только из start menu через "Run as administrator". Очень похоже на происки UAC - хотя никаких запросов на повышение привилегий не поступало.

среда, 29 октября 2014 г.

Serial console для сервера

В моем домашнем сервере нет видеокарты (и ставить ее туда не планирую). Для управления сервером используется SSH, а на случай проблем с сетью решил добавить поддержку serial console.

Доступен только один последовательный порт, но если вы хотите узнать сколько последовательных портов поддерживается и какие у них названия, нужно выполнить команду:

$ grep ttyS /var/log/dmesg
[    1.107765] serial8250: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
[    1.296739] 00:08: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A

Настраивать буду поддержку serial console в загрузчике, ядре и init.

Настройка Grub2

В файл /etc/default/grub нужно добавить поддержку serial

GRUB_CMDLINE_LINUX="console=tty0 console=ttyS0,9600"
GRUB_TERMINAL="serial console"
GRUB_SERIAL_COMMAND="serial --speed=9600 --unit=0 --word=8 --parity=no --stop=1"

и обновить конфигурацию grub

$ sudo update-grub

Настройка init

В файл /etc/inittab нужно добавить строку

S0:2345:respawn:/sbin/getty -L ttyS0 9600 vt100

и перезагрузить init

$ sudo telinit q

Для тестирования нужно подключиться через последовательный порт к серверу и перезагрузить его. Если на терминале установлены правильные настройки (9600 8n1), то мы должны увидеть лог загрузки.

Особенности конфигурации

Если последней опцией ядра указано "console=ttyS0,9600", то лог загрузки системы (вывод от init) будет только на ttyS0. В это время на первом терминале ничего выводиться не будет. Это может создать впечатление, что сервер завис, особенно если запустится проверка дисков.

Bacula: Как восстановить одну директорию из бэкапа используя bconsole

Раньше если нужно восстановить данные из бэкапа, то для работы с Bacula пользовался графическим интерфейсом bat. Сегодня потребовалось восстановить только одну директорию из бэкапа сервера, содержащего большое количество файлов. Попытка подготовить задание восстановления через bat намертво его повесила. Пришлось прибить bat, снять запросы к БД и идти осваивать консольный вариант - bconsole.

$ sudo bconsole
*restore client=srv11.example.com-fd
Using Catalog "MyCatalog"

First you select one or more JobIds that contain files
to be restored. You will be presented several methods
of specifying the JobIds. Then you will be allowed to
select which files from those JobIds are to be restored.

To select the JobIds, you have the following choices:
     1: List last 20 Jobs run
     2: List Jobs where a given File is saved
     3: Enter list of comma separated JobIds to select
     4: Enter SQL list command
     5: Select the most recent backup for a client
     6: Select backup for a client before a specified time
     7: Enter a list of files to restore
     8: Enter a list of files to restore before a specified time
     9: Find the JobIds of the most recent backup for a client
    10: Find the JobIds for a backup for a client before a specified time
    11: Enter a list of directories to restore for found JobIds
    12: Select full restore to a specified Job date
    13: Cancel
Select item:  (1-13):

Поскольку нужно восстановить последний бэкап, выбираю "5: Select the most recent backup for a client"

Select item:  (1-13): 5
Automatically selected FileSet: Standard Set
+-------+-------+-----------+-----------------+---------------------+--------------+
| JobId | Level | JobFiles  | JobBytes        | StartTime           | VolumeName   |
+-------+-------+-----------+-----------------+---------------------+--------------+
| 1,119 | F     | 5,022,824 | 168,370,798,105 | 2014-10-12 23:37:33 | Archive-0078 |
| 1,119 | F     | 5,022,824 | 168,370,798,105 | 2014-10-12 23:37:33 | Archive-0079 |
| 1,119 | F     | 5,022,824 | 168,370,798,105 | 2014-10-12 23:37:33 | Archive-0081 |
| 1,119 | F     | 5,022,824 | 168,370,798,105 | 2014-10-12 23:37:33 | Archive-0082 |
| 1,277 | D     |   430,784 |  18,791,703,231 | 2014-10-27 06:26:52 | Archive-0080 |
| 1,294 | I     |    90,159 |   3,764,072,742 | 2014-10-28 00:28:47 | Archive-0013 |
| 1,294 | I     |    90,159 |   3,764,072,742 | 2014-10-28 00:28:47 | Archive-0080 |
| 1,310 | I     |    75,993 |   4,224,432,445 | 2014-10-28 23:08:27 | Archive-0013 |
+-------+-------+-----------+-----------------+---------------------+--------------+
You have selected the following JobIds: 1119,1277,1294,1310

Building directory tree for JobId(s) 1119,1277,1294,1310 ...  ++++++++++++++++++++++++++++++++++++++++++
4,260,904 files inserted into the tree.

You are now entering file selection mode where you add (mark) and
remove (unmark) files to be restored. No files are initially added, unless
you used the "all" keyword on the command line.
Enter "done" to leave this mode.

cwd is: /
$

Около минуты занимает построение списка. После появление приглашения можно добавить нужные файлы в задание восстановления.

$ cd /var/www/vhosts/
cwd is: /var/www/vhosts/

$ add shop.example.com
23,405 files marked.

$ exit

После команды "exit" bacula выдаст информацию по созданному заданию восстановления и запросит подтверждение.

Bootstrap records written to /var/lib/bacula/bacula-dir.restore.4.bsr

The job will require the following
   Volume(s)                 Storage(s)                SD Device(s)
===========================================================================
   
    Archive-0082              File                      FileStorage              
    Archive-0013              File                      FileStorage              

Volumes marked with "*" are online.


23,408 files selected to be restored.

Run Restore job
JobName:         RestoreFiles
Bootstrap:       /var/lib/bacula/bacula-dir.restore.4.bsr
Where:           /bacula/restore
Replace:         always
FileSet:         Standard Set
Backup Client:   srv11.example.com-fd
Restore Client:  srv11.example.com-fd
Storage:         File
When:            2014-10-29 11:56:46
Catalog:         MyCatalog
Priority:        10
Plugin Options:  *None*
OK to run? (yes/mod/no):

Если все верно, то выбираем "yes" и ждем пока данные восстановятся.

четверг, 23 октября 2014 г.

Консольное кунг-фу

Задача: сделать локальную копию всех файлов "*.png" с абстрактного сервера с сохранением структуры каталогов.

Как сделать это в Windows я понятия не имею, но в Linux это делается в одну строку

$ ssh user@host "cd /path/to/src && find -name '*.png' -print0 | tar -cf- --null -T-" | tar -xf- -C /path/to/dst

В отличии от варианта с rsync не требует наличия rsync на удаленной машине.

среда, 22 октября 2014 г.

Squeeze-LTS: The following packages cannot be authenticated!

Если вы пользуетесь Squeeze-LTS и также столкнулись с ошибкой

# apt-get upgrade
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following packages will be upgraded:
  apt apt-utils rsyslog tzdata
4 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Need to get 3375 kB of archives.
After this operation, 344 kB disk space will be freed.
Do you want to continue [Y/n]? 
WARNING: The following packages cannot be authenticated!
  apt tzdata apt-utils rsyslog
Install these packages without verification [y/N]? 
E: Some packages could not be authenticated

то вам может помочь следующий рецепт:
  • закомментируйте строку, касающуюся squeeze-lts в /etc/apt/sources.list
  • выполните apt-get update
  • раскомментируйте строку, касающуюся squeeze-lts в /etc/apt/sources.list
  • выполните apt-get update
  • выполните обновление системы
Спасибо Christophe Moille за подсказку.

четверг, 16 октября 2014 г.

Три новые уязвимости в OpenSSL

Опубликовали репорт на три новые уязвимости в OpenSSL (CVE-2014-3566, CVE-2014-3567, CVE-2014-3068). В качестве решения предлагается обновить OpenSSL до следующих версий:
OpenSSL 1.0.1 users should upgrade to 1.0.1j
OpenSSL 1.0.0 users should upgrade to 1.0.0o
OpenSSL 0.9.8 users should upgrade to 0.9.8zc
В репозитариях Debian и CentOS обновление пока не замечено. Для защиты от CVE-2014-3566 отключил поддержку SSLv3 на серверах.

понедельник, 13 октября 2014 г.

PHP Fatal error: Call to undefined function hash_equals()

Довелось разбираться почему не работает плагин Mailchimp для WordPress. Анализ лога показал, что плагин использует функцию hash_equals(), которая появилась только в php 5.6.0. Обновлять PHP до последней версии - не вариант. Немного поиска и нашлась аналогичная реализация hash_equals() на PHP.

Можно либо вставить код функции в нужный файл, либо подключить через require_once().

четверг, 2 октября 2014 г.

Извечная борьба - костыль vs говнокод

А я все ломал голову, что же стало с Windows 9. Оказывается все банально и просто - номер версии это костыль для совместимости с говнокодом.

Запуск Apache jMeter на удаленном сервере через SSH туннель

В который раз ловлю себя на мысли, что нужно описать в Wiki способ запуска Apache jMeter на другом сервере через SSH туннель. Такой вид тестирования позволяет исключить влияние скорости передачи данных на результат теста и максимально исключить разброс значений при многократных повторениях теста.

Чтобы не плодить сущности просто дам ссылку на отличный мануал, описывающий сабж.

вторник, 30 сентября 2014 г.

Мой блиц-доклад с летнего LVEE 2014

Наткнулся на свой доклад с летнего LVEE 2014. Оказывается я постоянно пританцовываю на месте - понятия не имею почему, но нужно от этого избавляться.



Больше видео с летнего LVEE 2014

воскресенье, 21 сентября 2014 г.

Прекращение поддержки Ubuntu Quantal и Ubuntu Raring в моем репозитарии

Лучше поздно, чем никогда - в связи с End-Of-Life для Ubuntu Quantal и Ubuntu Raring я прекращаю собирать пакеты Midnight Commander для этих дистрибутивов.

Спасибо человеку, который дернул меня, что с репозитарием пакетов для Midnight Commander что-то не так. В процессе починки сего я и наткнулся на отсутствие нужных пакетов в репозитарии ftp.ubuntu.com/ubuntu/.

Обновляйтесь дамы и господа.

четверг, 4 сентября 2014 г.

Опять на тему 3G у MTS

Сегодня я хвалил MTS за приличную скорость работы, но сейчас вечер и интернет скорее мертв чем жив. Неважно через что я подключаюсь - wifi tethering на телефоне или USB модем (Huaweu E1550).

Только что выполнил тест скорости на speedtest.net

Прямое подключение к интернет через 3G
При таком жестком раскладе TCP/IP не справляется, в дампе траффика видно много пакетов SYN, но без ответного SYN ACK. В итоге через какое-то время соединение закрывается так и не открывшись. Открытые соединения тоже отваливаются через какое-то время неактивности. Очень похоже на тупой шейпер, который просто дропает пакеты подряд без разбора.

Но совсем другая картина, если подключиться к корпоративному VPN (OpenVPN через UDP) и повторить тот же тест на speedtest.net

Подключение к интернет через VPN по 3G
Через VPN соединение все летает шустро и без проблем. Выводы каждый делает сам, но похоже востребованность VPN в будущем будет только расти.

С таким 3G уже можно жить


Вторую неделю живу в отрыве от цивилизации. Интернет - только 3G (это особенно больно после рафинированного 100Mb/s Ethernet от АтлантТелекома).

Сегодня пару часов разгребал последствия падения инфраструктуры у хостера и только под вечер заметил, что как-то быстро интернет работает и особо не лагает. Зашел на speedtest.net - вполне приличный результат для 3G вечером. Вкупе с Hyper.net от MTS - жить можно. Надеюсь халява не закончится пока я это пишу...

P.S. Вчера скорость вечером была около 800-900kb/s, что даже для SSH напрягало.

вторник, 2 сентября 2014 г.

Эмулятор виртуальной смарткарты

В процессе изучения вопроса по использованию смарткарт в Linux наткнулся на проект Virtual Smart Card Architecture который предоставляет средства для эмуляции ридеров и самих смарткарт в Linux, Windows и MacOS X.

Features
  • Virtual smart card: Emulates a German Elektronischer Reisepass, ISO-7816 or cryptoflex cards
  • Virtual smart card: Connects to virtual reader over the internet
  • Virtual smart card: Supports relaying a local smart card to the virtual reader
  • PCSC relay: Emulates a ISO/IEC 14443 smart card relaying communication to a local smart card
  • PCSC relay: Uses OpenPICC or libnfc devices as NFC antenna for card emulation
  • nPA Library: Supports establishing a secure messaging channel to the new German identity card ("neuer Personalausweis" nPA)
  • nPA Library: Supports easy to use secure messaging implementation
  • nPA Library: Includes tool for PIN management for the nPA
  • Smart card reader emulator: Compatible with default CCID driver for windows and unix
  • Smart card reader emulator: Supports secure PIN commands
  • Smart card reader emulator: Supports PACE ("Standardleser" CAT-S)

Из всего фреймворка меня в первую очередь интересует функционал по эмуляции виртуальной смарткарты, потому я и подготовил пакет для пары экспериментов.

Установить его можно из моего репозитория

$ sudo aptitude install virtualsmartcard
$ sudo service pcscd restart

Для удобства работы со смарткартами нужно установить пакет opensc.

$ sudo aptitude install opensc

И затем проверить, что виртуальные ридеры видны в системе и доступны прикладному софту.

$ opensc-tool --list-readers
# Detected readers (pcsc)
Nr.  Card  Features  Name
0    No              Virtual PCD 00 00
1    No              Virtual PCD 00 01
2    No              Virtual PCD 00 02
3    No              Virtual PCD 00 03
4    No              Virtual PCD 00 04
5    No              Virtual PCD 00 05
6    No              Virtual PCD 00 06
7    No              Virtual PCD 00 07
8    No              Virtual PCD 00 08
9    No              Virtual PCD 00 09
10   No              Broadcom Corp 5880 [Contacted SmartCard] (0123456789ABCD) 00 00

В соседнем терминале запустим эмулятор смарткарты стандарта ISO7816 и проверим реакцию на это событие.

$ vicc -t iso7816
02.09.2014 11:24:28  [WARNING] Using default SAM parameters. PIN=1234, Card Nr=1234567890
02.09.2014 11:24:28  [INFO] Connected to virtual PCD at localhost:35963
02.09.2014 11:24:28  [INFO] Power Up
02.09.2014 11:24:29  [INFO] Power Down

Теперь обновим состояние ридеров - по идее сейчас виртуальная карта должна появиться в одном из ридеров.

$ opensc-tool --list-readers
# Detected readers (pcsc)
Nr.  Card  Features  Name
0    Yes             Virtual PCD 00 00
1    No              Virtual PCD 00 01
2    No              Virtual PCD 00 02
3    No              Virtual PCD 00 03
4    No              Virtual PCD 00 04
5    No              Virtual PCD 00 05
6    No              Virtual PCD 00 06
7    No              Virtual PCD 00 07
8    No              Virtual PCD 00 08
9    No              Virtual PCD 00 09
10   No              Broadcom Corp 5880 [Contacted SmartCard] (0123456789ABCD) 00 00

Все верно и в первом ридере статус карты сменился с "No" на "Yes". Теперь попробуем поработать с картой через opensc-explorer.

Запрос информации о корневом файле
OpenSC [3F00]> info 3F00

Dedicated File  ID 3F00

File path:     3F00
File size:     65535 bytes
ACL for SELECT:       N/A
ACL for LOCK:         N/A
ACL for DELETE:       NONE
ACL for CREATE:       NONE
ACL for REHABILITATE: NONE
ACL for INVALIDATE:   NONE
ACL for LIST FILES:   NONE
ACL for CRYPTO:       N/A
ACL for DELETE SELF:  N/A

Генерация 8 случайных чисел в смарткарте
OpenSC [3F00]> random 8
00000000: F9 B3 C9 9D 8F D6 DC 81 ........

Создаем на смарткарте файл 8888/1F00 и загружаем его обратно на диск
$ dd if=/dev/urandom of=test.bin bs=1024 count=1
1+0 записей считано
1+0 записей написано
 скопировано 1024 байта (1,0 kB), 0,000283354 c, 3,6 MB/c

$ opensc-explorer
OpenSC [3F00]> mkdir 8888 256

OpenSC [3F00]> cd 8888

OpenSC [3F00/8888]> create 1F00 1024

OpenSC [3F00/8888]> put 1F00 test.bin
Total of 1024 bytes written.

OpenSC [3F00/8888]> info 1F00

Elementary File  ID 1F00

File path:     3F00/8888/1F00
File size:     1024 bytes
EF structure:  Transparent
ACL for READ:         N/A
ACL for UPDATE:       N/A
ACL for DELETE:       N/A
ACL for WRITE:        N/A
ACL for REHABILITATE: N/A
ACL for INVALIDATE:   N/A
ACL for LIST FILES:   N/A
ACL for CRYPTO:       N/A

OpenSC [3F00/8888]> get 1F00 check.bin
Total of 1024 bytes read from 1F00 and saved to check.bin.

OpenSC [3F00/8888]> rm 1F00

OpenSC [3F00/8888]> cd ..

OpenSC [3F00]> rm 8888

Проверим, что содержимое файлов test.bin и check.bin совпадает

$ md5sum test.bin check.bin 
804420d7560e82065b74eff561cfb2c8  test.bin
804420d7560e82065b74eff561cfb2c8  check.bin

Несмотря на работу базовых функций инициализировать карту в формат PKCS15 не удастся.

Если нужна низкоуровневая работа с картой, то можно попробовать инструмент Java Smart Card Explorer.

$ wget --trust-server-names http://sourceforge.net/projects/jsmartcard/files/latest/download
$ java -jar JSmartCardExplorer.jar


PulseAudio для Skype

Вчера-позавчера Skype 4.2.x окончательно отказался входить в сеть и мне пришлось обновиться до версии 4.3.0.37. Примечательно, что при обновлении теряется возможность работать со звуком через ALSA и теперь для этого нужен PulseAudio. Если при первом запуске не переименовать старый профиль, то skype будет вылетать с ошибкой сегментации, поэтому

$ mv ~/.Skype ~/.Skype~
$ skype

Даже если у вас и не установлен сервер pulseaudio, то скорее всего его клиентская часть libpulse0 у вас уже установлена - остается установить сам pulseaudio, но так чтобы он не поломал работающие с alsa приложения. Для этого подойдет эта инструкция.

Для начала устанавливаем pulseaudio

$ sudo aptitude update
$ sudo aptitude install pulseaudio

Далее настраиваем общесистемную конфигурацию pulseaudio для совместной работы с ALSA.

/etc/pulse/daemon.conf
exit-idle-time = 0 # Exit as soon as unneeded
flat-volumes = yes # Prevent messing with the master volume

/etc/pulse/client.conf
# Applications that uses PulseAudio *directly* will spawn it,
# use it, and pulse will exit itself when done because of the
# exit-idle-time setting in daemon.conf
autospawn = yes

/etc/pulse/default.pa
# This startup script is used only if PulseAudio is started per-user
# (i.e. not in system mode)

.fail
    # Set tsched=0 here if you experience glitchy playback. This will
    # revert back to interrupt-based scheduling and should fix it.
    #
    # Replace the device= part if you want pulse to use a specific device
    # such as "dmix" and "dsnoop" so it doesn't lock an hw: device.
    
    # INPUT/RECORD
    load-module module-alsa-source device="default" tsched=1
    
    # OUTPUT/PLAYBACK
    load-module module-alsa-sink device="default" tsched=1 
    
    # Accept clients -- very important
    load-module module-native-protocol-unix

.nofail
.ifexists module-x11-publish.so
    # Publish to X11 so the clients know how to connect to Pulse. Will
    # clear itself on unload.
    load-module module-x11-publish
.endif

После этого запускаю два экземпляра MPlayer (один через pulseaudio, а второй через ALSA) и убеждаюсь, что все работает и PulseAudio не пытается захватить монопольно звуковое устройство.

$ mplayer -ao pulse music/one.mp3
$ mplayer -ao alsa music/two.mp3

Если в результате оба трека играют одновременно, то можно запускать skype и продолжать радоваться жизни.

понедельник, 1 сентября 2014 г.

Немного подробностей о работе access check в MySQL

Если вы создали в MySQL пользователя someuser@'%' и не можете взять в толк, почему его не пускает с localhost, то вам по этой ссылке.

Более подробно вопрос раскрыт в официальной документации MySQL.

Чтобы продебажить приоритет в котором выдается доступ, нужно выполнить следующий запрос

SELECT Host,User FROM mysql.user ORDER BY Host DESC, User DESC;

В результате вы получите что-то вроде такой выборки

+-------------+-----------------+
| Host        | User            |
+-------------+-----------------+
| mysql55.lan | root            |
| mysql55.lan |                 |
| localhost   | root            |
| localhost   |                 |
| ::1         | root            |
| 127.0.0.1   | root            |
| %           | someuser        |
+-------------+-----------------+

При таком раскладе берется первое совпадение - Host="localhost", User="" (пустое поле User означает любого пользователя) и следовательно до обработки someuser дело не доходит.

суббота, 30 августа 2014 г.

Смена доменного имени для блога на Wordpress

Для обкатки изменений в блоге, таких как смена оформления, установка и настройка модулей, желательно сначала проводить тестирование на staging версии блога и только потом переносить изменения на live сайт. В случае с wordpress недостаточно скопировать исходники и базу. Нужно еще сделать замены в новой базе с учетом специфики wordpress.

Уже несколько раз подряд я пользуюсь инструментом Search-Replace-DB и все проходит нормально.

Конвертирование репозитария из mercurial в git

Относительно недавно довелось переводить один из внутренних проектов с mercurial на git. На всякий случай я делал миграцию на копии репозитария, чего и вам советую во избежание всяких неожиданностей.

Итак, сначала делаем копию репозитария (я добавляю опцию --noupdate, чтобы скопировать только метаданные)

$ hg clone --noupdate project.orig project.hg

Затем нам нужно установить расширение hg-git и подключить его в ~/.hgrc. В дебиан для этого нужно установить пакет mercurial-git

$ sudo aptitude install mercurial-git
$ cat >> ~/.hgrc <<_EOF_
[extensions]
hgext.bookmarks =
hgext.git =
hgext.convert =
_EOF_

Инициализируем пустой git репозитарий (тут нужно обратить внимание на опцию --bare, иначе hg push закончится ошибкой "прервано: git remote error: refs/heads/master failed to update"

$ mkdir project.git
$ git init --bare project.git/.git
Initialized empty Git repository in /home/andrey/tmp/hg-to-git/project.git/.git/

Если нужно скопировать информацию о ветках, кроме default, то нужно сначала добавить соответствующие bookmarks в репозитарии mercurial

$ cd project.hg
$ hg bookmark -r default master
$ hg bookmark -r feature1 feature_1
...

Когда все будет готово настает время выполнить push из репозитария project.hg в project.git

$ cd project.hg
$ hg push ../project.git
проталкиваем в ../project.git/
creating and sending data

На большом репозитарии этот процесс может занять много времени и потребовать достаточный объем оперативной памяти. Если процесс завершился без ошибок, то пора проверить историю комитов и соответствие бранчей в project.git

$ cd project.git
$ git log -n 1
commit 2c765e70ad96c2bd2bc6cc0b545038f4faa42c25
Author: John Doe <john.doe@example.com>
Date:   Sun Apr 20 12:27:44 2014 +0300

    Latest fixes for reviews.

$ git branch
* master
  feature_1

Теперь все готово и можно работать с репозиторием через git.

пятница, 22 августа 2014 г.

Сегодня начинается LVEE 2014

LVEE
Заканчиваю паковать пожитки и через пару часов выдвигаюсь на LVEE 2014. В этом году еду в первый раз и надеюсь прохладная погода не испортит впечатление от конференции.

четверг, 7 августа 2014 г.

Как в Git просмотреть файл целиком из определенной ревизии

Начинаю осваивать Git в качестве альтернативы Mercurial - потребовалось просмотреть файл целиком за определенную ревизию. В Mercurial для этого есть "cat", т.е.

$ hg cat -r 2fad6072a89d path/to/file

в git для этого есть команда "show"

$ git show -r 269c3b6ca51a:path/to/file

среда, 16 июля 2014 г.

Дизайнеров нужно обязать пользоваться своими творениями

Человек, разработавший дизайн корпуса CoolerMaster Elite 241 - USB 3, если ты читаешь это, то попробуй как-нибудь на досуге поставить железо в свое творение. Возможно в этом случае ты поймешь какую хрень ты создал и тебе станет стыдно.

Зачем было уменьшать расстояние между блоком питания и отсеком для накопителей 5.25" до нескольких сантиметров?! Как в таком проеме отключать/подключать кабели? А что там будет с вентиляцией?


P.S. Открыл для себя внешний вид разъема "Front panel USB3". Как оказалось этот разъем обратно несовместим с материнкой где поддерживается только USB2. Хотя судя по pinout могли бы и сделать legacy ответвление наподобие звука (Azalia & AC97).

суббота, 5 июля 2014 г.

Привычное поведение функциональных клавиш на Logitech Comfort Keyboard K290

При очередной закупке железа довелось столкнуться с клавиатурами Logitech Comfort Keyboard K290. Отличные клавиатуры, что в принципе ожидаемо для продукции Logitech, если бы не одно НО. Я не сразу сообразил, почему у меня не получается войти в меню выбора загрузочных устройств (F8 или F12 на большинстве BIOS). После внимательного изучения клавиатуры стало ясно что теперь по-умолчанию функциональные клавиши действуют как мультимедийные, а для привычного поведения нужно нажимать комбинацию FN+F12. Это поведение программируется и раньше по-умолчанию было наоборот.

Печалит что подобное нововведение не упоминается на странице описания продукта, а указано лишь в прилагавшейся инструкции. Для решения проблемы Logitech предлагает установить утилиту Setpoint, чтобы перепрограммировать поведение клавиш. Поразительно, но standalone инсталятор для одной архитектуры (x86 или amd64) занимает примерно 80M! Что они туда напихали для меня остается загадкой, ну да ладно... Однако после смены настроек они сохраняются только до выключения компьютера. Т.е. нет сохранения настроек в самой клавиатуре (помнится настройки клавиатур Compaq с "Erase Ease" сохранялось в самой клавиатуре).

Если под Windows производитель худо-бедно позаботился о пользователях, то под Linux все сложнее. Я нашел проект k290-fnctl на GitHub'е который предназначен для программирования поведения функциональных клавиш. Чтобы собрать утилиту нужно проделать следующее:

$ sudo apt-get install g++ libusb-1.0-0-dev
$ git clone https://github.com/milgner/k290-fnkeyctl
$ cd k290-fnkeyctl
$ g++ -std=c++11  k290_fnkeyctl.cpp -lusb-1.0 -o k290_fnkeyctl
$ sudo install -o root -g root -m 0755 ./k290_fnkeyctl /usr/local/sbin
$ sudo install -o root -g root -m 0644 ./99-k290-config.rules /etc/udev/rules.d
$ sudo udevadm control --reload-rules
$ sudo udevadm trigger --subsystem-match=input

Примечательно, что размер полученного бинарника всего 59K. После этого все начинает работать и в Linux.

среда, 2 июля 2014 г.

Что может быть проще времени

Госдума во втором и третьем чтениях приняла закон о переходе РФ на зимнее время, таким образом, в октябре россияне переведут стрелки часов на час назад.

За принятие документа высказались 442 депутата, один — против. Закон предусматривает, что с 26 октября в 02.00 в большинстве субъектов РФ часы будут переведены на час назад, и в дальнейшем сезонного перевода стрелок осуществляться не будет.

Пользователям Windows XP скорее всего придется руками править реестр, чтобы внести обновления в настройки таймзон.

Интересно как теперь поведет себя Беларусь. В принципе мне нравится идея вернуться на зимнее (UTC+02:00) время, которое для Беларуси является географическим.

понедельник, 30 июня 2014 г.

Нельзя просто так взять и разобраться в лицензировании продуктов Microsoft


После прочтения этого у меня есть еще один аргумент, почему не стоит пользоваться их продукцией при наличии альтернативы.

Q2 - If I have guests that come into my office an temporarily use a Windows DHCP server to grab an IP address to access the Internet, do they need CALs?

A2 - Yes, they are using a Windows Server service and would need a CAL.

среда, 18 июня 2014 г.

Вот теперь PayPal точно пришел в Беларусь

Новость порадовала. За несколько минут создал новую учетку в paypal и привязал к ней банковскую карту. Надеюсь лавочку не прикроют в скором времени.

воскресенье, 1 июня 2014 г.

В гугле забанен!

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

P.S. Такое часто бывает в сети провайдера АтлантТелеком по выходным и связано с множеством людей, которые сидят за NAT с одного IP. Перейти на Yandex или DuckDuckGo что ли...

суббота, 31 мая 2014 г.

Добавление корневого сертификата локального CA в системный ca-certificates.crt и Java keystore

При попытке подключиться в JXplorer к LDAP серверу с использованием SSL выдало предупреждение о неизвестном сертификате.


Вариант "This Session Only" решает проблему, но является временным. Попытка выбрать вариант "Always" заканчивается ошибкой, поскольку нет прав на запись в системное хранилище (/etc/ssl/certs/java/cacerts).

В Debian установка корневых сертификатов автоматизирована - нужно установить пакет ca-certificates, скопировать нужный сертификат в директорию /usr/local/share/ca-certificates и выполнить команду update-ca-certificates.

# aptitude install ca-certificates
# install -m 0644 /tmp/Corp-CA.crt /usr/local/share/ca-certificates
# update-ca-certificates

При этом содержимое сертификата Corp-CA.crt будет добавлено в бандл /etc/ssl/certs/ca-certificates.crt (используется по-умолчанию приложениями в системе) и при необходимости в дополнительные хранилища, подключенные через хуки /etc/ca-certificates/update.d. Поскольку у меня установлена java, то добавление сертификата в хранилище java произойдет автоматически при выполнении хука /etc/ca-certificates/update.d/jks-keystore.

Если вы хотите добавить сертификат руками, то это можно сделать так:

$ sudo keytool -keystore /etc/ssl/certs/java/cacerts -import -trustcacerts -alias "Corp CA" -file /tmp/Corp-CA.crt

В процессе выполнения спросит пароль от keystore - если вы ничего не меняли, то пароль по-умолчанию "changeit". Теперь проверим, что наш сертификат добавился

keytool -keystore /etc/ssl/certs/java/cacerts -list -alias 'Corp CA'
Corp CA, 29.05.2014, trustedCertEntry, 
Certificate fingerprint (SHA1): 15:2C:D3:50:20:69:43:2D:C7:C1:B7:06:6A:23:38:07:63:F3:EF:22

Теперь jxplorer подключается без лишних вопросов.

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

Включение планировщика DEADLINE для SSD дисков

По-умолчанию в большинстве дистрибутивов Linux сейчас используется планировщик ввода/вывода CFQ. Он показывает неплохие результаты для смешанной нагрузки, но для SSD дисков есть вариант получше. Для последних оптимальным будет deadline или noop. Раньше я использовал конструкцию вида

echo deadline > /sys/block/sda/queue/scheduler
echo deadline > /sys/block/sdc/queue/scheduler

но сегодня в процессе репетиции восстановления сервера из резервной копии я наткнулся на ошибку при загрузке копии сервера (связана с различием в конфигурации). Чтобы каждый раз не указывать планировщик для нужных дисков я решил доверить это дело UDEV.

Сначала проверим текущие настройки планировщиков

# cat /sys/block/sd*/queue/scheduler
noop anticipatory deadline [cfq]
noop anticipatory deadline [cfq]
noop anticipatory deadline [cfq]
noop anticipatory deadline [cfq]

В данный момент для всех дисков (2 SSD и 2 HDD) установлен планировщик CFQ. Теперь добавим правило UDEV, которое будет изменять планировщик на DEADLINE для всех non-rotational устройств.

# cat > /etc/udev/rules.d/65-ssd-deadline.rules <<_EOF_
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="deadline"
_EOF_
# udevadm control --reload-rules
# udevadm trigger --subsystem-match='block'

Снова проверим настройки планировщиков

# cat /sys/block/sd*/queue/scheduler
noop anticipatory [deadline] cfq
noop anticipatory [deadline] cfq
noop anticipatory deadline [cfq]
noop anticipatory deadline [cfq]

В этот раз для двух первых дисков настройки изменились - это как раз SSD диски. Для обычных HDD дисков остался CFQ.

пятница, 25 апреля 2014 г.

Как программно перезагрузить зависшее USB устройство

Для резервирования интернет соединения я использую 3G модем Huawei E173, подключенный в USB порт маршрутизатора. Соединение через него всегда поднято в режиме горячего резерва (для переключения на модем достаточно сбросить default route с основного соединения). Но есть одна проблема - периодически модем "зависает" и соединение теряется.

Как правило достаточно перезапустить pppd, но вчера модем перестал реагировать совсем. В логе появились сообщения, которые относятся к проблемам скорее аппаратным.

xhci_hcd 0000:02:00.0: WARN Event TRB for slot 1 ep 4 with no TDs queued?
xhci_hcd 0000:02:00.0: WARN Event TRB for slot 1 ep 4 with no TDs queued?
xhci_hcd 0000:02:00.0: WARN Event TRB for slot 1 ep 4 with no TDs queued?
xhci_hcd 0000:02:00.0: ERROR Transfer event TRB DMA ptr not part of current TD
xhci_hcd 0000:02:00.0: ERROR Transfer event TRB DMA ptr not part of current TD
xhci_hcd 0000:02:00.0: ERROR Transfer event TRB DMA ptr not part of current TD

Перезапуск pppd ничего не дал, похоже модем не отвечает ни на одну команду.

Apr 24 10:02:11 inet chat[6761]: abort on (\nBUSY\r)
Apr 24 10:02:11 inet chat[6761]: abort on (\nERROR\r)
Apr 24 10:02:11 inet chat[6761]: abort on (\nNO ANSWER\r)
Apr 24 10:02:11 inet chat[6761]: abort on (\nNO CARRIER\r)
Apr 24 10:02:11 inet chat[6761]: abort on (\nNO DIALTONE\r)
Apr 24 10:02:11 inet chat[6761]: abort on (\nRINGING\r\n\r\nRINGING\r)
Apr 24 10:02:11 inet chat[6761]: send (^MAT^M)
Apr 24 10:02:11 inet chat[6761]: timeout set to 12 seconds
Apr 24 10:02:11 inet chat[6761]: expect (OK)
Apr 24 10:02:23 inet chat[6761]: alarm
Apr 24 10:02:23 inet chat[6761]: Failed

Попытки переинициализировать модем программно не увенчались успехом, поскольку его устройство (/dev/ttyUSB0) не отвечает на AT команды. Остается только отключить и снова включить модем в порт. Но сначала решил попробовать метод, на который наткнулся недавно в интернете.

Для сброса нужной шины USB нам потребуется скомпилировать бинарник. Чтобы не компилировать его каждый раз снова и пользоваться им на практически любой машине я буду компилировать его статически.

$ wget https://gist.githubusercontent.com/x2q/5124616/raw -O usbreset.c
$ gcc -Wall -static -o usbreset usbreset.c
$ sudo install -o root -g root -m 0755 usbreset /usr/local/sbin
$ lsusb | grep Huawei
Bus 001 Device 002: ID 12d1:1001 Huawei Technologies Co., Ltd. E169/E620/E800 HSDPA Modem
$ sudo usbreset /dev/bus/usb/001/002
Error in ioctl: No such device

Несмотря на ошибку в логе появились записи, свидетельствующие о "перезагрузке" модема.

$ dmesg | tail
usb 1-6: New USB device strings: Mfr=3, Product=2, SerialNumber=0
usb 1-6: Product: HUAWEI Mobile
usb 1-6: Manufacturer: HUAWEI Technology
usb 1-6: configuration #1 chosen from 1 choice
option 1-6:1.0: GSM modem (1-port) converter detected
usb 1-6: GSM modem (1-port) converter now attached to ttyUSB0
option 1-6:1.1: GSM modem (1-port) converter detected
usb 1-6: GSM modem (1-port) converter now attached to ttyUSB1
option 1-6:1.2: GSM modem (1-port) converter detected
usb 1-6: GSM modem (1-port) converter now attached to ttyUSB2

Попробуем подключиться к нему и выполнить несколько AT команд.

$ screen /dev/ttyUSB0 115200
ATZ
OK
ATI
Manufacturer: huawei
Model: E173
Revision: 11.126.16.00.715
IMEI: 861976004215827
+GCAP: +CGSM,+DS,+ES

OK

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

понедельник, 21 апреля 2014 г.

Будьте внимательны при обновлении vzctl до версии 4.7

Если вы используете OpenVZ и решили обновить сервер, то не пропустите важное сообщение при обновлении vzctl до версии 4.7.

============================================================================
Due to conntrack impact on venet performance, conntrack need to be disabled
on the host system (it will still work for containers).

Adding the following option to /etc/modprobe.d/openvz.conf:

      options nf_conntrack ip_conntrack_disable_ve0=1

This change will take effect only after the next reboot.

NOTE: IF YOU NEED conntrack functionality, edit /etc/modprobe.d/openvz.conf NOW,
changing =1 to =0. DO NOT REMOVE the line, or it will be re-added!
============================================================================

Начиная с этой версии по-умолчанию отключается conntrack в VE0 (на hardware node). Если ваш файервол полагается на conntrack, то вы рискуете закрыть всем (и себе тоже) доступ на Hardware Node по сети.

воскресенье, 20 апреля 2014 г.

Пакеты Midnight Commander для Ubuntu Trusty Tahr

На днях вышла Ubuntu Trusty Tahr (13.04). Сегодня я добавил поддержку этой версии в мой сборщик пакетов для проекта Midnight Commander. На данный момент доступны последние версии stable и nightly.

Как подключить репозитарий указано тут.

пятница, 18 апреля 2014 г.

Отключение запроса PIN для SIM карты через AT команды

Если вы не отключили защиту SIM через PIN код перед установкой карты в модем, то не стоит расстраиваться, вытаскивать ее и ставить в телефон. Защиту можно отключить используя AT команды модема. В примере PIN код равен "1111", а управляющий порт модема /dev/ttyUSB0. Если у вас другие значения, то замените на свои.

$ screen /dev/ttyUSB0 115200
ATZ
OK
AT+CPIN?
+CPIN: SIM PIN
AT+CPIN="1111"
OK
AT+CLCK="SC",0,"1111"
OK

среда, 9 апреля 2014 г.

139905006626448:error:0906D064:PEM routines:PEM_read_bio:bad base64 decode:pem_lib.c:818:

В процессе устранения CVE-2014-0160 дошел до обновления всех сертификатов на серверах. Поскольку уязвимость создает вероятность получения секретного ключа, то нужно сгенерировать сертификат заново.

$ openssl genrsa -out /etc/ssl/private/example.com.key 2048
$ chmod 0400 /etc/ssl/private/example.com.key
$ openssl req -new -out /etc/ssl/certs/example.com.csr -key /etc/ssl/private/example.com.key

Полученный файл example.com.csr нужно подписать у удостоверяющего центра. Мы пользуемся Thawte через посредника и в ответ на повторный выпуск сертификата пришел zip архив

$ unzip -l reissue.zip
Archive:  reissue.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
     1744  2014-04-09 09:56   ServerCertificate.cer
     4815  2014-04-09 09:56   PKCS7.p7b
     1642  2014-04-09 09:56   CACertificate-1.cer
     1540  2014-04-09 09:56   CACertificate-2.cer
---------                     -------
     9741                     4 files

Файлы с расширением CER это сертификат в формате PEM. Перед установкой нового сертификата в веб-сервер проверяю его информацию

$ mkdir ssl-tmp
$ cd ssl-tmp
$ unzip ../reissue.zip
$ openssl x509 -in ServerCertificate.cer -text -noout
unable to load certificate
139905006626448:error:0906D064:PEM routines:PEM_read_bio:bad base64 decode:pem_lib.c:818:

Облом. OpenSSL отказывается читать сертификат, ссылаясь на неверное base64 кодирование. Открываю сертификат в текстовом редакторе и смотрю его глазами. В теле base64 есть пробелы! А ведь пробелов быть не должно... Попробовал сравнить содержимое с предыдущим сертификатом и нашел, что возможно по ошибке "+" заменился на " ". В качестве проверки делаю замену всех пробелов на "+" между строками "-----BEGIN CERTIFICATE-----" и "-----END CERTIFICATE-----".

После замены снова проверяю сертификат

$ openssl x509 -in ServerCertificate.cer -text -noout

В этот раз проверка прошла успешно, повторяю действия для CACertificate-1.cer и CACertificate-2.cer. И проверяю их аналогично. В конце останется только установить новый сертификат на сервере.

среда, 2 апреля 2014 г.

понедельник, 31 марта 2014 г.

Сегодня "World Backup Day 2014" - начать делать бэкапы никогда не поздно

Сегодня всемирный день бэкапа. Создайте и проверьте бэкап сегодня, чтобы не стать жертвой розыгрыша завтра.

Я вот под шумок перевел парочку хостов с rdiff-backup на bacula и проверил восстановление из старого бэкапа. Теперь останется только просматривать отчеты bacula по утрам.


понедельник, 24 марта 2014 г.

Выбор уже сделан за вас

Решил просмотреть на компьютере mobi версию книги "Дети пространства" Витуса Вагнера перед заливкой в читалку. Но при запуске Kindle Reader'а получил это


На мой взгляд Amazon ведет себя по-свински предлагая таким образом обновление.

пятница, 14 марта 2014 г.

Пакетирование драйвера для принтера Panasonic KX-MB2020RU

В офисе стоят сетевые МФУ Panasonic, в частности Panasonic KX-MB2020RU. Для Linux производитель предоставляет бинарный драйвер для CUPS. Чтобы не превращать систему в слакварь я оборачиваю файлы драйвера в пакет.

Для Debian это удобно сделать через checkinstall. Отличная утилита, которая контролирует этап установки и перехватывает обращения к файловой системе, отслеживая изменения в процессе установки. По окончании установки все изменения упаковываются в бинарный пакет.

Для начала установим checkinstall

$ sudo aptitude install checkinstall

Далее скачиваем дистрибутив драйвера с сайта производителя и запускаем установку через checkinstall

$ wget http://cs.psn-web.net/support/fax/common/file/Linux_PrnDriver/Driver_Install_files/mccgdi-2.0.6-i686.tar.gz
$ tar -xf mccgdi-2.0.6-i686.tar.gz
$ cd mccgdi-2.0.6-i686
$ sudo checkinstall --inspect ./install-driver

This package will be built according to these values: 

0 -  Maintainer: [ Andrey Tataranovich <tataranovich@gmail.com> ]
1 -  Summary: [ Driver for Panasonic GDI printers ]
2 -  Name:    [ printer-driver-mccgdi ]
3 -  Version: [ 2.0.6 ]
4 -  Release: [ 1 ]
5 -  License: [ GPL ]
6 -  Group:   [ checkinstall ]
7 -  Architecture: [ i386 ]
8 -  Source location: [ mccgdi-2.0.6-i686 ]
9 -  Alternate source location: [  ]
10 - Requires: [ cups ]
11 - Provides: [ mccgdi-2.0.6 ]
12 - Conflicts: [  ]
13 - Replaces: [  ]

Enter a number to change any of them or press ENTER to continue: 

Installing with ./install-driver...

========================= Installation results ===========================

    start  install......
    start install files......
    restart spooler - CUPS
[ ok ] Restarting Common Unix Printing System: cupsd.

    install driver completed

    please use "system-config-printer" or "lpadmin" to add printer.

======================== Installation successful ==========================

You requested to review the list of files that will be
included in this package.

Now you'll have the chance to review and optionally modify it.

Press ENTER to continue.

Copying files to the temporary directory...OK

Stripping ELF binaries and libraries...OK

Compressing man pages...OK

Building file list...OK

Building Debian package...OK

Installing Debian package...OK

Erasing temporary files...OK

Writing backup package...OK
OK

Deleting temp dir...OK


**********************************************************************

 Done. The new package has been installed and saved to

 /home/andrey/mccgdi-2.0.6-i686/printer-driver-mccgdi_2.0.6-1_i386.deb

 You can remove it from your system anytime using: 

      dpkg -r printer-driver-mccgdi

**********************************************************************

В процессе установки вам будет предложено просмотреть и возможно отредактировать список файлов, которые будут включены в пакет. Я удалил все упоминания /var, которые добавились из-за перезапуска CUPS в процессе установки, и файл /usr/local/share/panasonic/printer/uninstall-driver, который в пакете не нужен.

В итоге получился пакет, который легко удалить или проапгрейдить в будущем.

$ aptitude show printer-driver-mccgdi
Package: printer-driver-mccgdi           
New: yes
State: installed
Automatically installed: no
Version: 2.0.6-1
Priority: extra
Section: checkinstall
Maintainer: Andrey Tataranovich 
Architecture: i386
Uncompressed Size: 4,530 k
Depends: cups
Provides: mccgdi-2.0.6
Description: Driver for Panasonic GDI printers
 Panasonic printer drivers

Nginx: запаролить доступ к директории с PHP скриптами

Очень удивился когда Nginx дал выполнить скрипт из запароленной директории. При этом на саму директорию пароль спрашивает.

Этот ответ прояснил ситуацию. Полное описание логики блока location.

четверг, 13 марта 2014 г.

Отключение файла hiberfil.sys в Windows 7

В Windows 7 из настроек Power Options убрали пункт "Enable hibernation" (в Windows XP он был на вкладке Hibernation в Power Options). Чтобы отключить файл hiberfil.sys нужно выполнить с правами Администратора команду

powercfg.exe -h off

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

powercfg.exe -h on

Разработчики Replicant выявили бэкдор в смартфонах и планшетах Samsung Galaxy

Не могу не перепостить

Разработчики Replicant выявили бэкдор в смартфонах и планшетах Samsung Galaxy

вторник, 11 марта 2014 г.

Nginx: client intended to send too large body

Если в логи nginx падает ошибка вида

2014/03/11 11:54:28 [error] 8699#0: *4615315 client intended to send too large body: 1569729 bytes, client: xx.xx.xx.xx, server: example.com, request: "POST /upload/index.php HTTP/1.1", host: "example.com", referrer: "http://example.com/upload/"

То причина в превышении лимита размера тела запроса в Nginx, за этот лимит отвечает параметр client_max_body_size (по-умолчанию лимит равен 1m).

Чтобы увеличить этот лимит хотя бы до 50m добавьте в конфигурацию nginx (в Debian это можно сделать через файл /etc/nginx/conf.d/local.conf)

# echo 'client_max_body_size 50m;' > /etc/nginx/conf.d/local.conf
# nginx -t
the configuration file /etc/nginx/nginx.conf syntax is ok
configuration file /etc/nginx/nginx.conf test is successful
# service nginx reload

P.S. Ответ нашелся тут.

понедельник, 10 марта 2014 г.

Полная очистка SSD диска

Перед началом использования SSD диска желательно выполнить его полное стирание. Если SSD диск уже использовался ранее, то полное стирание (secure erase) позволит контроллеру не производить предварительную подготовку ячеек NAND перед операцией записи. Если вы не в курсе почему так, то можно почитать это.

Сначала нужно убедиться, что SSD диск не заблокирован BIOS'ом.

$ sudo hdparm -I /dev/sda | grep frozen
 not frozen

Если в результате вывело "not frozen", то можно переходить далее. Иначе нужно искать способ, как разблокировать диск. Один из способов разблокировать диск - выполнить suspend to ram

$ echo mem | sudo tee /sys/power/state

Чтобы выполнить secure erase нужно выполнить следующие команды (ВНИМАНИЕ! Secure erase безвозвратно удалит все данные с выбранного диска!)

$ sudo hdparm --user-master u --security-set-pass PasSWorD /dev/sda
security_password="PasSWorD"

/dev/sda:
 Issuing SECURITY_SET_PASS command, password="PasSWorD", user=user, mode=high

$ sudo hdparm --user-master u --security-erase PasSWorD /dev/sda
security_password="PasSWorD"

/dev/sda:
 Issuing SECURITY_ERASE command, password="PasSWorD", user=user

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

среда, 5 марта 2014 г.

Отключить использование PDIFF в APT

Чтобы отключить использование PDIFF нужно добавить в файл /etc/apt/apt.conf строку Acquire::PDiffs "false";

$ cat <<_EOF_ | sudo tee -a /etc/apt/apt.conf
Acquire::PDiffs "false";
_EOF_

суббота, 1 марта 2014 г.

Подготовка образа дискеты с virtio драйвером для установки Windows Server 2003

Использование Windows Server 2003 на выделенном сервере сегодня имеет крайне мало смысла. Но старый солдат еще послужит, если перенести систему в виртуальную машину. В качестве системы виртуализации используется гипервизор KVM, что позволяет использовать virtio драйвера (storage, network, balloon) для оптимальной производительности.

Сначала создаю файл образа дискеты

$ truncate -s 1440k ./virtio-floppy_0.1-49.ima
$ sudo mkfs -t vfat -n VIRTIO ./virtio-floppy_0.1-49.ima
$ sudo mkdir /mnt/floppy
$ sudo mount -o loop,rw ./virtio-floppy_0.1-49.ima /mnt/floppy

Скачиваю образ с virtio драйверами. По этому совету я выбрал версию 0.1-49.

$ wget http://alt.fedoraproject.org/pub/alt/virtio-win/archives/virtio-win-0.1-49/virtio-win-0.1-49.iso

Создаю структуру установочного диска

$ sudo mkdir /mnt/iso
$ sudo mount -o ro,loop ./virtio-win-0.1-49.iso /mnt/iso
$ sudo mkdir -p /mnt/floppy/{i386,amd64}/Win2003
$ sudo touch /mnt/floppy/disk1
$ sudo cp /mnt/iso/WNET/X86/VIOSTOR.* /mnt/floppy/i386/
$ sudo cp /mnt/iso/WNET/AMD64/VIOSTOR.* /mnt/floppy/amd64/
$ cat<<_EOF_ | sudo tee /mnt/floppy/txtsetup.oem
[Disks]
d1 = "OEM DISK (SCSI) Win2003/32-bit",\disk1,\i386\Win2003
d2 = "OEM DISK (SCSI) Win2003/64-bit",\disk1,\amd64\Win2003

[Defaults]
SCSI = WNET32

[scsi]
WNET32 = "Red Hat VirtIO SCSI Disk Device Win2003/32-bit"
WNET64 = "Red Hat VirtIO SCSI Disk Device Win2003/64-bit"

[Files.scsi.WNET32]
driver = d1, viostor.sys, viostor
inf    = d1, viostor.inf
catalog= d1, viostor.cat

[Files.scsi.WNET64]
driver = d2, viostor.sys, viostor
inf    = d2, viostor.inf
catalog= d2, viostor.cat

[HardwareIds.scsi.WNET32]
id = "PCI\VEN_1AF4&DEV_1001&SUBSYS_00000000", "viostor"
id = "PCI\VEN_1AF4&DEV_1001&SUBSYS_00020000", "viostor"
id = "PCI\VEN_1AF4&DEV_1001&SUBSYS_00021AF4", "viostor"

[HardwareIds.scsi.WNET64]
id = "PCI\VEN_1AF4&DEV_1001&SUBSYS_00000000", "viostor"
id = "PCI\VEN_1AF4&DEV_1001&SUBSYS_00020000", "viostor"
id = "PCI\VEN_1AF4&DEV_1001&SUBSYS_00021AF4", "viostor"

[Config.WNET32]
value = Parameters\PnpInterface,5,REG_DWORD,1

[Config.WNET64]
value = Parameters\PnpInterface,5,REG_DWORD,1
_EOF_

Осталось подчистить хвосты

$ sudo umount /mnt/{iso,floppy}
$ sudo rmdir /mnt/{iso,floppy}

В результате в файле ./virtio-floppy_0.1-49.ima находится образ дискеты для установки Windows Server 2003 на диск, доступный через virtio контроллер.

Модификация Seabios для гипервизора KVM

Для модификации BIOS потребуется установить пару зависимостей

$ sudo aptitude install build-essential iasl

Внедрение секции ACPI_SLIC (используется SLIC той машины, где выполняется модификация) в BIOS для гипервизора KVM

$ git clone https://github.com/ghuntley/seaslic.git seaslic
$ cd seaslic
$ git clone git://git.seabios.org/seabios.git seabios.submodule
$ cd seabios.submodule
$ git checkout rel-1.7.3.2
$ cd ..
$ ./patch.sh

После завершения компиляции нужно установить модифицированную версию Seabios в систему (я не заменяю дистрибутивный BIOS, вместо этого устанавливается отдельная версия)

$ sudo mkdir /opt/seaslic
$ sudo cp seabios.submodule/out/bios.bin /opt/seaslic

Далее нужно отредактировать конфигурацию виртуальной машины

$ export LIBVIRT_DEFAULT_URI=qemu:///system
$ virsh edit vmname

В открывшемся редакторе нужно привести XML файл виртуальной машины к подобному виду

<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
...
  <qemu:commandline>
    <qemu:arg value='-bios'/>
    <qemu:arg value='/opt/seaslic/bios.bin'/>
  </qemu:commandline>
</domain>

После сохранения файла и перезапуска виртуальной машины в BIOS будет доступна дополнительная секция.

понедельник, 24 февраля 2014 г.

Растущее количество dropped пакетов в ifconfig

Настраивая новую систему мониторинга я заметил, что график ошибок сетевого адаптера одного из серверов показывает рост значения RX packets: dropped.

# ifconfig em2
em2       Link encap:Ethernet  HWaddr 00:25:90:d0:df:18  
          inet addr:xx.xx.xx.xx  Bcast:xx.xx.xx.255  Mask:255.255.255.0
          inet6 addr: fe80::225:90ff:fed0:df18/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:180047091 errors:0 dropped:31438 overruns:0 frame:0
          TX packets:165010458 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:58487975592 (58.4 GB)  TX bytes:192626658770 (192.6 GB)
          Memory:f7100000-f7180000

Это может говорить о том, что система не успевает забирать пакеты из буфера приема сетевого адаптера. Хотя в этом случае должно расти и значение RX packets: overruns.

Поиск в гугле вывел на возможное объяснение такому поведению. Такое поведение счетчика ошибок поясняется цитатой ниже

Beginning with kernel 2.6.37, it has been changed the meaning of dropped packet count. Before, dropped packets was most likely due to an error. Now, the rx_dropped counter shows statistics for dropped frames because of:

  • Softnet backlog full
  • Bad / Unintended VLAN tags
  • Unknown / Unregistered protocols
  • IPv6 frames when the server is not configured for IPv6

If any frames meet those conditions, they are dropped before the protocol stack and the rx_dropped counter is incremented.

Вариант с Softnet backlog full я исключил сразу, поскольку ошибки распределены более-менее равномерно и присутствуют даже при траффике менее 100 пакетов в секунду.

Для проверки остальных пунктов на сутки был запущен tcpdump на проблемном интерфейсе em2.



По истечении суток показания мониторинга подтвердили теорию - ошибки при запущенном tcpdump не появляются, а следовательно можно не дергать сервер.

понедельник, 17 февраля 2014 г.

Локальный репозитарий с reprepro

Устанавливаем reprepro

# aptitude install reprepro

Создаем корневую директорию для репозитория и конфигурацию reprepro

# mkdir -p /var/www/debian/conf
# cat > /var/www/debian/conf/distributions <<_EOF_
Origin: Amasty
Suite: stable
Codename: wheezy-amasty
Version: 7.0
Architectures: i386 amd64 source
Components: main backports
UDebComponents: main backports
Description: Local Amasty repository
_EOF_

Теперь нужно инициализировать созданную конфигурацию

# reprepro -b /var/www/debian export
# reprepro -b /var/www/debian createsymlinks

Пакеты уже залиты на сервер в директорию /tmp/incoming, добавляем их в секцию main

# reprepro -b /var/www/debian -C main includedsc /tmp/incoming/*.dsc
# reprepro -b /var/www/debian -C main includedeb /tmp/incoming/*.deb

Осталось подчистить "хвосты"

# rm -fr /tmp/incoming

четверг, 13 февраля 2014 г.

Резервное копирование домашнего медиацентра

Сегодня наводил окончательный лоск в настройках домашнего медиацентра (Raspberry PI + OpenELEC) после переноса его директории /storage с SD карты на сервер NFS (SD карта используется только для загрузки, а все файлы конфигурации и пользовательских данных хранятся на сервере и доступны через NFS).

Когда с настройками было покончено я сделал резервную копию средствами OpenELEC, но вот что интересно - резервная копия выполняется без завершения работы XBMC, а значит часть файлов копируется в процессе использования.

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

OpenELEC:~ # lsof | grep /storage
866 /usr/sbin/connmand /storage/.cache/connman/ethernet_b827eb9ace35_cable/data
946 /usr/lib/xbmc/xbmc.bin /storage/.xbmc/temp/xbmc.log
946 /usr/lib/xbmc/xbmc.bin /storage/.xbmc/userdata/Database/Addons15.db
946 /usr/lib/xbmc/xbmc.bin /storage/.xbmc/userdata/Database/Textures13.db
946 /usr/lib/xbmc/xbmc.bin /storage/.xbmc/userdata/Database/TV22.db
946 /usr/lib/xbmc/xbmc.bin /storage/.xbmc/userdata/Database/Epg7.db
946 /usr/lib/xbmc/xbmc.bin /storage/.xbmc/userdata/Database/Addons15.db

Открытые файлы *.db это базы SQLite, которые могут быть в промежуточном состоянии на момент создания резервной копии.

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

После изучения системы инициализации в OpenELEC оказалось, что самым простым способом достичь желаемого - выполнить перезагрузку всего медиацентра. В процессе завершения работы системы выполняется скрипт /storage/.config/shutdown.sh, который запускается после выключения XBMC, но до перезагрузки всей системы.

Собственно скрипт

if [ "`date +'%H'`" != "05" ]; then
 echo "Seems triggered not by cron job, simply exiting"
 exit 0
fi

STAMP=`date +'%Y%m%d%H%M%S'`

if [ ! -d /storage/backup ]; then
 mkdir /storage/backup
fi

echo "Settings backup..."
tar -cf /storage/backup/${STAMP}.tar /storage/.cache /storage/.config /storage/.xbmc

if [ "`date +'%u'`" == "7" ]; then
 echo "Flash backup..."
 tar -cf /storage/backup/${STAMP}_flash.tar /flash
fi

echo "Backup finished, syncing..."
sync
sleep 30s

Скрипт проверяет в котором часу он запущен и если сейчас не 5 часов утра, то создание резервной копии отменяется - скорее всего это перезагрузка по требованию пользователя, а не задания крона. Далее создается TAR-архив, содержащий конфигурацию OpenELEC и XBMC. Также если скрипт запущен в воскресенье, то дополнительно создается резервная копия всей системы (защита от неудачного обновления самого OpenELEC или выхода из строя SD карточки). Перед завершением скрипта выполняется сброс буферов и выжидается 30 секунд (на всякий случай).

Задание крона выглядит так

# crontab -u root -l

# Reboot to create semi-offline backup
10 5 * * * /usr/bin/xbmc-send --action="XBMC.Reboot"

Согласно этому заданию в каждый день в 5:10 утра выполняется команда перезагрузки средствами XBMC, что гарантирует корректное завершение работы.

Настройка PHP 5.3 для работы в FastCGI режиме в Debian Squeeze

Процесс установки описан для Debian Squeeze и в других дистрибутивах или релизах Debian процесс может незначительно отличаться. Устанавливаем необходимые пакеты

# aptitude install spawn-fcgi php5-cli php5-cgi php5-curl php5-gd php5-imap php5-mcrypt php5-mysql

Далее нужно создать скрипт инициализации FastCGI менеджера (spawn-fcgi)

# vim /etc/init.d/php5-fcgi

#! /bin/sh
### BEGIN INIT INFO
# Provides:          php5-fcgi
# Required-Start:    $all
# Required-Stop:     $all
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: PHP FastCGI
# Description:       PHP FastCGI
### END INIT INFO

PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="PHP FastCGI"
NAME=php5-fcgi
DAEMON=/usr/bin/spawn-fcgi
FCGI_SOCKET=/var/run/php5-fcgi.sock
FCGI_USER=www-data
FCGI_MODE=0600
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME
DAEMON_ARGS="-s $FCGI_SOCKET -M $FCGI_MODE -u $FCGI_USER -U $FCGI_USER -P $PIDFILE -- /usr/bin/php5-cgi"

[ -x "$DAEMON" ] || exit 0

[ -r /etc/default/$NAME ] && . /etc/default/$NAME

. /lib/init/vars.sh

. /lib/lsb/init-functions

do_start()
{
        start-stop-daemon --start --quiet --pidfile $PIDFILE --exec /usr/bin/php5-cgi --test >/dev/null \
                || return 1
        start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \
                $DAEMON_ARGS >/dev/null \
                || return 2
}

do_stop()
{
        start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE
        RETVAL="$?"
        rm -f $PIDFILE $FCGI_SOCKET
        return "$RETVAL"
}


case "$1" in
  start)
        [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
        do_start
        case "$?" in
                0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
                2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
        esac
        ;;
  stop)
        [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
        do_stop
        case "$?" in
                0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
                2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
        esac
        ;;
  status)
       status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
       ;;
  restart|force-reload)
        log_daemon_msg "Restarting $DESC" "$NAME"
        do_stop
        case "$?" in
      0|1)
                do_start
                case "$?" in
                        0) log_end_msg 0 ;;
                        1) log_end_msg 1 ;; # Old process is still running
                        *) log_end_msg 1 ;; # Failed to start
                esac
                ;;
      *)
                # Failed to stop
                log_end_msg 1
                ;;
        esac
        ;;
  *)
        echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2
        exit 3
        ;;
esac

:

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

# vim /etc/default/php5-fcgi

export PHP_FCGI_CHILDREN=10
export PHP_FCGI_MAX_REQUESTS=1000

Запускаем сервис php5-fcgi и добавляем его в автозапуск

# invoke-rc.d php5-fcgi start
# update-rc.d php5-fcgi defaults

вторник, 11 февраля 2014 г.

Использование Gmail в качестве почтового шлюза для Postfix

Если ваш IP адрес "проклят", то при попытке доставить почту на сервера Gmail вы увидите что-то наподобие этого

status=bounced (host gmail-smtp-in.l.google.com[173.194.70.26] said: 550-5.7.1 [87.xx.xx.xx] The IP you're using to send mail is not authorized to 550-5.7.1 send email directly to our servers. Please use the SMTP relay at your 550-5.7.1 service provider instead. Learn more at 550 5.7.1 http://support.google.com/mail/bin/answer.py?answer=10336 g47si26393674eev.48 - gsmtp (in reply to end of DATA command))

Выход прост -  если вам не нужна возможность доставлять почту от разных людей (в моем случае письма только от систем мониторинга), то можно создать почтовый ящик Gmail и слать почту через него. В этом случае локальный почтовый сервер выступает в роли авторизованного клиента Gmail. Из минусов пожалуй только перезапись From: (вроде это можно как-то настраивать).

Если postfix еще не установлен, то самое время его установить

# aptitude install postfix ca-certificates

Сказать postfix, что нужно доставлять почту через релей

# vim /etc/postfix/main.cf

relayhost = [smtp.gmail.com]:587
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_tls_CAfile = /etc/postfix/cacert.pem
smtp_use_tls = yes

Указать данные авторизации в Gmail в файле /etc/postfix/sasl_passwd

# vim /etc/postfix/sasl_passwd

[smtp.gmail.com]:587    USERNAME@gmail.com:YOURPASSWORD

После нужно выставить правильные разрешения на файл паролей и создать его хешированную версию

# chmod 0400 /etc/postfix/sasl_passwd
# postmap /etc/postfix/sasl_passwd

Остается только дать postfix доступ к сертификату удостоверяющего центра Gmail (это thawte)

# cp /etc/ssl/certs/Thawte_Premium_Server_CA.pem /etc/postfix/cacert.pem

Перезагружаем конфигурацию postfix и пробуем отправить тестовое письмо

# service postfix reload
# echo 'test message' | mail -s 'relayhost test' someuser@gmail.com

пятница, 7 февраля 2014 г.

Получение информации о принтере через SNMP

Установите SNMP клиент и поддержку загрузки MIB баз

$ sudo aptitude install snmp snmp-mibs-downloader

Закоментируйте строку mibs : в файле /etc/snmp/snmp.conf. Это позволит использовать MIB, которые скачаются при установке пакета snmp-mib-downloader.

Скачайте IETF Printer MIB (я нашел тут) и распакуйте его в директорию ~/.snmp/mibs (создайте эту директорию, если она еще не существует). Затем добавьте в ~/.snmp/snmp.conf строку mibs +Printer-MIB.

Теперь вы можете просмотреть значение переменных

$ snmpwalk -c public -v1 192.168.100.201 SNMPv2-MIB::sysDescr
SNMPv2-MIB::sysDescr.0 = STRING: Panasonic KX-MB2020

P.S. Большая подборка MIB для различных вендоров нашлась тут.

воскресенье, 26 января 2014 г.

Эксплойт для обхода ограничений full disk encryption

Greg Kroah-Hartman упомянул эксплойт для обхода защиты full disk encryption. Для успешной эксплуатации уязвимости нужен физический доступ к компьютеру и диск должен быть разблокирован (введен пароль дешифровки диска). Для защиты ваш компьютер должен быть выключен или находиться в состоянии suspend to disk (hibernate). Более радикальным вариантом защиты будет блокировка или удаление драйверов FireWire из операционной системы.

Суть уязвимости заключается в том, что firewire шина позволяет получить прямой доступ к памяти хоста (нижние 4GB памяти) через запрос DMA (протокол SBP-2). После этого аппаратная отмычка сканирует память хоста и патчит механизм проверки пароля. Результатом успешной атаки является возможность авторизоваться по любому паролю.

Если вы считаете, что отсутствие порта firewire вас защитит, то прочтите ответы 5 и 7 в FAQ.

Чтобы отключить поддержку FireWire в Linux (инструкция для свежих ядер) добавьте в файл /etc/modprobe.d/blacklist.conf строки

blacklist firewire-core
blacklist firewire-ohci
blacklist firewire-sbp2

Выгрузите модули из памяти и обновите образ initramfs

# modprobe -r firewire-ohci
# update-initramfs -u -k all

пятница, 24 января 2014 г.

Преобразование формата даты 24/Jan/2014 в 2014-01-24

В процессе написания парсера логов мне потребовалось преобразовывать формат дат в shell скрипте. В логе дата указывается в виде 24/Jan/2014, а мне нужна 2014-01-24. Для преобразования формата даты я написал функцию convert_date()

# Convert date format from %d/%b/%Y to %Y-%m-%d (strftime notation)
convert_date() {
    date --date="$(echo $1 | awk -F '/' '{print $2" "$1" "$3}')" +'%Y-%m-%d'
}

Пример использования

STAMP=$(convert_date 24/Jan/2014)

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

Неправильный порядок nameserver'ов в /etc/resolv.conf при работе NetworkManager через resolvconf

Недавно подключался к корпоративной сети в "полевых" условиях и наткнулся на несовместимость NetworkManager (0.9.4.0-10) и resolvconf (1.67) в Debian Wheezy. Проблема известная, но патча или какого-то грамотного workaround'а я не увидел.

Если кратко, то записи о nameserver'ах в /etc/resolv.conf прописываются в неверном порядке если для подключения к сетям использовать NetworkManager. Если подробнее, то NetworkManager неправильно взаимодействует с resolvconf и передает неверное с точки зрения resolvconf имя интерфейса (точнее сказать не передает совсем). Resolvconf требует указывать название интерфейса и название программы, которая обновляет информацию о резолверах (например /sbin/resolvconf -a ppp0.pppd). При этом добавление записи в /etc/resolv.conf выполняется согласно порядку интерфейса в /etc/resolvconf/interface-order.

Например вы подключились через 3G модем к сотовому оператору и название вашего интерфейса ppp0. Сотовый оператор выдает два nameserver'а (x.x.x.1 и x.x.x.2). Далее вы подключаетесь к корпоративной сети VPN и вам выдает еще два nameserver'a (y.y.y.1 и y.y.y.2). Чтобы все работало правильно нужно чтобы /etc/resolv.conf выглядел так:

nameserver y.y.y.1
nameserver y.y.y.2
nameserver x.x.x.1
nameserver x.x.x.2

Но вместо этого в /etc/resolv.conf записи выглядят так:

nameserver x.x.x.1
nameserver x.x.x.2
nameserver y.y.y.1
nameserver y.y.y.2

Поскольку корпоративные nameserver'а оказались в конце списка, то внутренние ресурсы оказываются недоступными.

В процессе изучения проблемы оказалось, что NetworkManager использует вызов /sbin/resolvconf -a NetworkManager (указывает все nameserver'а без указания принадлежности к интерфейсу). Один из вариантов - изменить файл /etc/resolvconf/interface-order, чтобы явно задать приоритет NetworkManager, но поскольку это NM не следует соглашению, то я решил поправить его код.

Нужный мне участок кода быстро нашелся в файле NetworkManager/src/dns-manager/nm-dns-manager.c. Для добавления и удаления записей через resolvconf используется функция dispatch_resolvconf()

#ifdef RESOLVCONF_PATH
static gboolean
dispatch_resolvconf (const char *domain,
                     char **searches,
                     char **nameservers,
                     const char *iface,
                     GError **error)
{
 char *cmd;
 FILE *f;
 gboolean retval = FALSE;

 if (! g_file_test (RESOLVCONF_PATH, G_FILE_TEST_IS_EXECUTABLE))
  return FALSE;

 if (domain || searches || nameservers) {
  cmd = g_strconcat (RESOLVCONF_PATH, " -a ", "NetworkManager", NULL);
  nm_log_info (LOGD_DNS, "(%s): writing resolv.conf to %s", iface, RESOLVCONF_PATH);
  if ((f = popen (cmd, "w")) == NULL)
   g_set_error (error,
                NM_DNS_MANAGER_ERROR,
                NM_DNS_MANAGER_ERROR_SYSTEM,
                "Could not write to %s: %s\n",
                RESOLVCONF_PATH,
                g_strerror (errno));
  else {
   retval = write_resolv_conf (f, domain, searches, nameservers, error);
   retval &= (pclose (f) == 0);
  }
 } else {
  cmd = g_strconcat (RESOLVCONF_PATH, " -d ", "NetworkManager", NULL);
  nm_log_info (LOGD_DNS, "(%s): removing resolv.conf from %s", iface, RESOLVCONF_PATH);
  if (nm_spawn_process (cmd) == 0)
   retval = TRUE;
 }

 g_free (cmd);

 return retval;
}
#endif

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

--- NetworkManager/src/dns-manager/nm-dns-manager.c.orig 2014-01-16 12:10:52.265616559 +0300
+++ NetworkManager/src/dns-manager/nm-dns-manager.c 2014-01-16 12:15:09.069611996 +0300
@@ -416,7 +416,7 @@ dispatch_resolvconf (const char *domain,
   return FALSE;
 
  if (domain || searches || nameservers) {
-  cmd = g_strconcat (RESOLVCONF_PATH, " -a ", "NetworkManager", NULL);
+  cmd = g_strconcat (RESOLVCONF_PATH, " -a ", iface, ".NetworkManager", NULL);
   nm_log_info (LOGD_DNS, "(%s): writing resolv.conf to %s", iface, RESOLVCONF_PATH);
   if ((f = popen (cmd, "w")) == NULL)
    g_set_error (error,
@@ -430,7 +430,7 @@ dispatch_resolvconf (const char *domain,
    retval &= (pclose (f) == 0);
   }
  } else {
-  cmd = g_strconcat (RESOLVCONF_PATH, " -d ", "NetworkManager", NULL);
+  cmd = g_strconcat (RESOLVCONF_PATH, " -d ", iface, ".NetworkManager", NULL);
   nm_log_info (LOGD_DNS, "(%s): removing resolv.conf from %s", iface, RESOLVCONF_PATH);
   if (nm_spawn_process (cmd) == 0)
    retval = TRUE;

После пересборки пакетов и обновления системы приоритет nameserver'ов правильный.

P.S. К сожалению этот патч не будет работать на последней версии NetworkManager, поскольку там изменился прототип функции dispatch_resolvconf() и имя интерфейса более не передается. Позже попробую закинуть им баг на эту тему.

среда, 15 января 2014 г.

Не знаете где взять редкий винт для ноутбука?

Если вам тоже не хватило какого-то мелкого винтика для ноутбука - не расстраивайтесь. Попробуйте заглянуть в ненужный cd/dvd привод - почти наверняка там найдется что-то подходящее. Я так себе вчера вечером нашел винт для крепления WWAN карты в своем ноутбуке.

А на будущее стоит заказать наборчик вроде этого - хватит надолго и знакомым можно будет отсыпать в случае чего.

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

Обновление BIOS на Dell Latitute E6410


Этот пост ориентирован на технически грамотную аудиторию. Если вы не обладаете необходимыми навыками - не пытайтесь повторить описанное. Я не несу никакой ответственности за ваши ошибки или возможный ущерб, возникший в следствии попытки повторить описанное.

Долго не мог решиться обновить BIOS в своем Dell Latitude E6410, но на прошлой неделе вышло очередное обновление A16 и я решил попробовать. Серьезных проблем с ноутбуком не было, но мелкие косяки иногда давали о себе знать. Пару раз при перезагрузке ноутбук выдавал ошибку процессора (мигает Num lock и горят Caps Lock и Scroll lock - на языке документации Dell это состояние называется FLASH-ON-ON). Еще есть известная проблема с динамическим управлением частотой процессора после выхода из S3 режима, при отключенном сетевом адаптере.

До обновления версия BIOS была A06 и производитель рекомендует обновляться до свежего релиза в три этапа:
Notes:
--------
1. Please note that if the A01 BIOS is currently installed on your system you must
first apply the P02 patch (E6410P02.EXE) before upgrading to this BIOS.
2. Please note that if the A08 or before A08 BIOS is currently installed on your system
you must first update to A09 BIOS and then flash to the latest A-rev BIOS.
3. Please note that if the A10 or before A10 BIOS is currently installed on your system
you must first update to A11 BIOS and then flash to the latest A-rev BIOS.

Следовательно нужно сначала обновиться с A06 до A09, затем до A11 и окончательно до A16.

Обновления BIOS доступны в виде EXE файлов, которые можно выполнить в Windows или DOS. Поскольку у меня нет установленной Windows, то я выбрал вариант с обновлением через DOS (FreeDOS).

Я не буду описывать весь процесс подготовки загрузочной флешки, готовый образ для записи на флешку можно скачать тут. После скачивания распаковать образ можно так (/dev/sdb - название устройства вашей флешки, если у вас другое, то измените команды соответственно):

$ wget http://www.tataranovich.com/public/dell/e6410_bios_update.img.gz
$ wget http://www.tataranovich.com/public/dell/MD5SUMS
$ md5sum -c MD5SUMS
e6410_bios_update.img.gz: ЦЕЛ
$ gunzip e6410_bios_update.img.gz
$ dd if=e6410_bios_update.img of=/dev/sdb

Не продолжайте дальше, если у вас не совпала контрольная сумма.

После подготовки нужно загрузиться с флешки и выбрать вариант загрузки "4 - Load FreeDOS without drivers"


Затем ввести в командной строке "E6410A09.EXE" и выполнить обновление до ревизии A09.


Далее аналогичным образом обновиться до A11 (E6410A11.exe) и A16 (E6410A16.exe).

Этот пост ориентирован на технически грамотную аудиторию. Если вы не обладаете необходимыми навыками - не пытайтесь повторить описанное. Я не несу никакой ответственности за ваши ошибки или возможный ущерб, возникший в следствии попытки повторить описанное.