Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #62, ФЕВРАЛЬ 2004 г.

Музыкальная шкатулка подручными средствами

Andrushock

Xakep, номер #062, стр. 062-110-2


# mkdir /var/spool/lpd/audio

# chown root:daemon /var/spool/lpd/audio

# chmod 755 /var/spool/lpd/audio

- переменная if (:if=/usr/local/bin/filter:) отвечает за входной фильтр, который по замыслу разработчиков lpd должен выполнять форматирование и преобразование отправленных на печать документов. Именно на этот фильтр мы делаем основную ставку:

# vi /usr/local/bin/filter

#!/bin/sh

/usr/local/bin/mpg123 --aggressive --stereo --8bit - > /dev/null 2>&1

Фильтр возьмет на себя роль посредника. Он будет принимать от пользователя (якобы для печати) задания со стандартного ввода (stdin), воспроизводить mp3-файлы с помощью консольного mp3-плеера (в данном случае mpg123) и посылать все сообщения об ошибках (stderr) на стандартный вывод (stdout).

В качестве альтернативы этому фильтру предложу тебе не менее элегантный вариант с временным файлом, в который со стандартного ввода будут записываться все необходимые для прослушивания композиции. После окончания воспроизведения temp-файл для экономии дискового пространства будет удаляться. Лично мне эта версия скрипта, пусть она и работает немного медленнее, нравится больше:

# vi /usr/local/bin/filter

#!/bin/sh

cat > /tmp/list.m3u

/usr/local/bin/mpg123 --aggressive --stereo --8bit /tmp/list.m3u > /dev/null 2>&1

rm -f /tmp/list.m3u

Далее присваиваем сценарию командного интерпретатора атрибут исполнения:

# chmod +x /usr/local/bin/filter

- с помощью переменной lf (:lf=/var/log/audio.err:) задается файл журналирования сообщений фильтра.

# cp /dev/null /var/log/audio.err

- переменная af (:af=/var/log/audio.acc:) используется для указания лог-файла, в котором учитывается распечатанный пользователем объем информации. Нам эти данные ни к чему, но все же для корректности работы lpd создадим и его:

# cp /dev/null /var/log/audio.acc

- с помощью переменной mx (:mx#0:) можно снять ограничение на максимально допустимый объем файла, посылаемого на печать. Примечание: если значение переменной является числом, то знак равенства заменяется знаком решетки.

- подавление печати заголовков производится с помощью переменной sh (:sh:).

В итоге, собрав по кусочкам все переменные вместе, получаем следующий конфиг для нашего виртуального mp3-принтера:

# vi /etc/printcap

mp3|local audio spooler:\

:lp=/dev/null:\

:sd=/var/spool/lpd/audio:\

:if=/usr/local/bin/filter:\

:lf=/var/log/audio.err:\

:af=/var/log/audio.acc:\

:mx#0:\

:sh:

Рулим спулером печати

Настало время запустить демон системы печати:

# lpd

$ netstat -na | grep 515

tcp 0 0 *.515 *.* LISTEN

В OpenBSD для автоматической загрузки lpd в системном конфигурационном файле /etc/rc.conf необходимо изменить значение директивы lpd_flags с NO на пустые двойные кавычки:

# vi /etc/rc.conf

lpd_flags=""

Пользователи FreeBSD добавляют в /etc/rc.conf следующую запись:

# vi /etc/rc.conf

lpd_enable="YES"

Если у тебя линукс, то в своем дистрибутиве ты без проблем, я надеюсь, найдешь start/stop скрипт для lpd, а затем добавишь его утилитой ntsysv или chkconfig в нужный runlevel.

Назад на стр. 062-110-1  Содержание  Вперед на стр. 062-110-3