CUPS в обход интерфейса

У меня есть сервер, на котором у меня есть несколько последовательных принтеров, настроенных как необработанные очереди в чашках. На каждом из них я установил сценарии интерфейсов для выполнения некоторых простых манипуляций с выводом и для обработки IPC с приложением, которое работает на сервере и предпочитает напрямую подключаться к принтерам и писать на них, что не очень хорошо сочетается с чашками, думая, что он исключительно контролирует принтерные устройства. Там вроде все работает.

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

Проблема, с которой я сталкиваюсь, заключается в том, что cups, похоже, обходят мои интерфейсы, когда получают такие файлы из этого второго приложения. Я проверил это, настроив два почти идентичных файла печати. Первый содержал простой текст «Привет, мир!» за которым следует символ новой строки; вторая содержала escape-коды для одного из принтеров, за которыми следовала фраза «Hello, world!» и новая строка. Затем я добавил строку «sleep 5» в интерфейс моего принтера, чтобы при печати была заметная задержка.

Когда я напечатал первый файл с помощью lp, секунд пять ничего не происходило, после чего принтер ожил и выписал "Hello, world!" Однако, когда я напечатал второй файл с помощью той же самой команды lp, он сразу же напечатал «Hello, world!» без сна. Я также отметил, что я могу использовать опцию «-o raw» в lp, чтобы заставить такое же поведение с первым файлом (немедленно распечатать его без пятисекундной задержки).

Я предполагаю, что cups просматривает фактические печатаемые данные и пытается определить их тип, и когда он видит escape-коды принтера в данных, он решает, что это «сырая» печать, и обходит интерфейс. Это не то поведение, которого я ожидал, поскольку я изначально настроил принтер как «необработанную» очередь и предположил, что это означает, что чашки будут просто передавать все, что отправляется ему через интерфейс; тем не менее, это поведение, которое я вижу.

Мой вопрос: Есть ли способ отправить чашкам параметр (кроме -o raw, который, по-видимому, также обходит интерфейс), говоря ему, чтобы он не определял тип полученных данных печати и продолжал и отправлял их. к сценарию интерфейса? В качестве альтернативы, есть ли способ указать формат входящих данных (например, сказать чашкам, что они получают "обычный текст", даже если он содержит escape-коды), чтобы cups не будут смотреть на него и просто передадут в интерфейс?


person William    schedule 04.09.2012    source источник


Ответы (1)


Очереди печати, которые у вас есть, НЕ "сырые"!

Во-первых, вы, кажется, не знаете, что такое необработанная очередь печати на языке CUPS: необработанная очередь — это та, которая не связана с...

  • ...ни скрипт интерфейса (скрипт с тем же именем, что и сама очередь, расположенная в /etc/cups/interfaces/),

  • ...и файл PostScript Printer Description (PPD) (файл PPD с тем же именем, что и у самой очереди, с дополнительным суффиксом *.ppd, расположенный в /etc/cups/ppd/) .

Поскольку вы говорите, что установили сценарий интерфейса для очередей принтеров, по определению это НЕ необработанные очереди!

Чтобы отправить задания как сырые (что означает: нефильтрованные) в несырые очереди CUPS, нет другого способа, кроме как использовать -o raw в командной строке lp. Вы также можете использовать (в качестве альтернативы) параметр -o document-format=application/vnd.cups-raw..., но он имеет точно такое же значение: он заставляет CUPS использовать ту же обработку заданий и нажимает всего в 7 раз больше клавиш клавиатуры.

В обоих случаях CUPS пропускает этап автоматического ввода входящего файла задания и пропускает его без фильтрации в серверную часть очереди.

Шаг автоматического ввода и его результат можно наблюдать в файле журнала /var/log/cups/error_log, выполнив поиск по ключевому слову Auto-typing после того, как ваш cupsd.conf активировал LogLevel debug: строка с упоминанием Request file type is ... сообщает вам, к какому типу MIME CUPS классифицирует ваше входящее задание.)

Как заставить CUPS обрабатывать входящие данные печати как текст

Используйте -o document-format=text/plain в командной строке lp.

Как настроить «сырые» очереди CUPS

Если вы хотите превратить (любую) существующую очередь печати в необработанную, просто удалите связанный файл PPD (/etc/cups/ppd/myprinter.ppd) или связанный сценарий интерфейсов (/etc/cups/interfaces/myprinter).

Если вы хотите установить очередь печати, чтобы она с самого начала действовала как необработанная, просто используйте имя принтера и внутренний URI, но не указывайте ни PPD, ни какой-либо сценарий интерфейса, который будет связан с ним:

Пример команды для установки "сырой" очереди печати:

 sudo lpadmin -p my_raw_printer -E -v socket://192.168.177.188:9100

(-p — указать имя очереди печати, -E — включить очередь печати с самого начала.)

Предположение: почему второе приложение может обходить ваш скрипт интерфейса

Не видя полной настройки вашей системы и не глядя на 2-е приложение (печать которого, кажется, ведет себя иначе, чем ваше 1-е) или без доступа к файлу CUPS error_log уровня отладки, можно только строить предположения:

  • я предполагаю, что ваше второе приложение использует какую-то жестко запрограммированную команду печати, которая неявно использует параметр команды печати -o raw.
person Kurt Pfeifle    schedule 04.09.2012
comment
Спасибо за ваш вклад. Попробую некоторые из ваших техник. Однако сначала я хотел бы ответить на ваше вышеприведенное предположение, предоставив немного больше информации о настройке моей системы (кстати, спасибо за обращение к моему неправильному использованию терминологии со словом raw). - person William; 05.09.2012
comment
1-е и 2-е приложения на самом деле являются одним и тем же приложением, но имеют два разных способа печати. Приложение само по себе является эмуляцией старой операционной системы, на которой работают другие приложения. В первом случае приложение открывает /dev/ttyXXXX и пишет напрямую в него, минуя cups вообще. Во втором случае он буферизует печать в файл и передает его своей собственной системе буферизации, которую я настроил с помощью драйверов для каждого принтера, которые просто вызывают lp. Поэтому я контролирую это второе использование и могу заверить вас, что -o raw не отправляется в командную строку. - person William; 05.09.2012
comment
Правильным ответом на мой вопрос было добавить -o document-format=text/plain в командную строку lp. Спасибо! - person William; 05.09.2012