В статье рассматривается устройство сервера печати CUPS, а также исследуется возможность применения CUPS API для вывода фракталов на печать.
Ключевые слова: CUPS, HTTP, IPP, система фильтрации, планировщик, фильтр, печать, принтер, ковёр Серпинского
В большинстве UNIX-подобных операционных систем используется сервер печати CUPS, состоящая из следующих компонентов [8]:
— планировщик,
— система фильтрации,
— бэк-энд.
Планировщик
Планировщик представляет собой серверное приложение, работающее по протоколам HTTP/1.1 [2] и IPP/2.1 [6]. Планировщик управляет HTTP и IPP запросами, принтерами, заданиями, подписками и оповещениями системы. HTTP используется для работы браузерных служб, а IPP — для отправляющих сообщений, которые инкапсулируются в HTTP POST запрос с типом контента application/ipp.
Планировщик является однопоточным приложением с запуском дочерних процессов для выполнения длительных операций. Обычно эти процессы выполняются от имени непривилегированного пользователя (lp), иногда с дополнительными ограничениями.
Планировщик представлен исполняемым файлом cupsd [9], настраиваемом с помощью файла конфигурации (по умолчанию это /etc/cups/cupsd.conf).
Планирование заданий происходит с помощью блокирующей очереди с приоритетами [10, 7], при печати на нескольких принтерах, подключенных к одному серверу, возможна параллельная печать с использованием алгоритма Round-robin [1] путём отправки задания первому доступному принтеру соответствующего класса.
Планировщик получает задания на печать от пользователя и отправляет их в систему фильтрации в соответствие фильтрам, указанным в задании [7 scheduler/main.c]. В случае отмены задания пользователем, планировщик посылает сигнал SIGTERM фильтрам и бэк-энду.
Система фильтрации
Система фильтрации [11] отвечает за преобразование файлов задания в формат, соответствующий требуемому принтеру. Может быть применена последовательность фильтров для преобразования исходного файла в требуемый формат в случае отсутствия требуемого прямого фильтра.
Планировщик запускает один или несколько фильтров для печати данного задания [12]. Первый фильтр всегда читает из файла и пишет в стандартный вывод, в то время как все остальные фильтры читают из стандартного ввода и пишут в стандартный вывод. Последний фильтр всегда бэк-энд, который читает из стандартного ввода и пишет на устройство.
Все фильтры, за исключением бэк-энда, работают от имени непривилегированного пользователя.
Взаимодействие с планировщиком
Первый фильтр в последовательности получает от планировщика путь к файлу, который необходимо напечатать.
В случае отмены задания планировщик отправляет всем фильтрам и бэк-энду сигнал SIGTERM, получив который фильтры, бэк-энд и мониторы порта должны его обработать, произвести необходимую очистку, сформировать валидный выходной файл или вернуть принтер в состояние готовности.
Также фильтры могут отправлять сообщения планировщику через stderr, информируя об ошибках, состоянии принтера и прогрессе печати.
Бэк-энд
Как уже упоминалось выше, бэк-энд — специальный вид фильтра, взаимодействующий напрямую с устройством печати [13]. также как фильтры, бэк-энд считывает данное из стандартного ввода или файла, но пишет на устройство. При запуске без аргументов выводится список доступных устройств.
Конфигурирование
Конфигурирование планировщика
Возможна настройка следующих основных параметров планировщика [14]:
— автоматическая очистка истории печати,
— указание протоколов, используемых для доступа к принтеру внутри локальной сети,
— размер бумаги по умолчанию,
— доменное имя сервера печати,
— политика обработки ошибок,
— настройки фильтрации (см. ниже),
— настройки отменённых и ошибочных заданий,
— параметры сервера (IP адрес, порт, Unix-сокет),
— и т. п.
Драйверы принтеров хранятся в PPD файлах, описывающих возможности принтеров конкретной модели.
Также возможна аутентификация на сервере [15, 16] с помощью учётной записи операционной системы или сертификата Kerberos [3].
Вывод фракталов на печать путём прямого взаимодействия с CUPS API
В целях исследования возможности вывода фракталов на печать, воспользуемся CUPS backend’ом 2file от KDE [17].
Используется компилятор gcc и библиотека libcups2-dev.
В качестве фрактала для исследования выберем ковёр Серпинского [5].
Как было сказано выше, задания на печать проходят через систему фильтрации перед отправкой на принтер. Одним из стандартных форматов для CUPS является PostScript [4, 18], для динамического формирования PostScript и его передачи CUPS может быть использована библиотека Cairo [19].
Алгоритм построение ковра Серпинского:
- Пусть размер ячейки на -й итерации .
- Строится закрашенный с вершинами в точках , , ,
- Рекурсивно запускается итерация алгоритма для каждого из 8 квадратов, окружающих центральный.
Для вывода изображения используется временный файл, который удаляется после завершения работы программы. Этот файл используется для хранения данных холста в Cairo и подаётся на вход системе фильтрации CUPS для печати на принтере по умолчанию (возможно реализовать меню с выбором требуемого принтера пользователем, используя cupsGetDests [20]).
Одна из особенностей CUPS — данные передаются на бэк-энд в векторном формате, а затем растеризуются под разрешение принтера и цветовой профиль документа конвертируются под требования конкретной модели принтера (например конвертация RGB в CMYK или градации серого в чёрно-белый). Этот факт позволяет ограничить глубину рекурсии, когда на наибольшей глубине рекурсии минимальный размер элемента равен 1 пиксель.
На каждой итерации при построении ковра Серпинского размер элемента уменьшается в 3 раза, таким образом максимальная глубина рекурсии, до которой имеет смысл проводить построение, равна , где и — ширина и высота холста в пикселях.
Согласно [21] для листа A4 размеры составляют 595x842.
Реализация
Процедура рисования фрактала выглядит следующим образом:
То есть на каждой итерации 8 рекурсивных вызовов и одна операция, выполняемая за константное время. Получаем сложность алгоритма , где — максимальная глубина рекурсии.
В параметре cr передаётся контекст Cairo, созданный на временном холсте. После запуска состояние холста записывается во временный файл и передаётся на стандартный принтер командой cupsPrintFile(cupsGetDefault(), tmpfilename, «cairo PS», 0, NULL) и удаляется. В результате получаем следующий вывод принтера:
Код работы с CUPS
Выводы
В результате исследования выяснено, что CUPS принимает в качестве задания файл, причём возможна динамическая генерация файла в формате PostScript.
Литература:
- Round-robin (алгоритм) // Википедия. 2020. [Электронный ресурс]. URL: https://ru.wikipedia.org/w/index.php?title=Round-robin_(%D0 %B0 %D0 %BB %D0 %B3 %D0 %BE %D1 %80 %D0 %B8 %D1 %82 %D0 %BC)&oldid=105303116 (дата обращения: 08.06.2021).
- Fielding R. [и др.]. RFC Editor. Hypertext Transfer Protocol -- HTTP/1.1. 1999.
- Neuman C. [и др.]. RFC Editor. The Kerberos Network Authentication Service (V5). 2005.
- Perry T. S. «PostScript» prints anything: a case history // IEEE Spectrum. 1988. № 5 (25). C. 42–46.
- Sierpinski W. Sur une courbe cantorienne qui contient une image biunivoquet et continue detoute courbe donnée. // Comptes rendus hebdomadaires des séances de l’Académie des sciences. 1916. (162). P. 629–632. URL: https://gallica.bnf.fr/ark:/12148/bpt6k3115n/f635.item (дата обращения 17.06.2021)
- The Printer Working Group. IPP Verson 2.0, 2.1, and 2.2. 2015.
- apple/cups Apple, 2021.
- CUPS Design Description [Электронный ресурс]. URL: http://www.cups.org/doc/spec-design.html (дата обращения: 08.06.2021).
- cupsd(8) [Электронный ресурс]. URL: https://www.cups.org/doc/man-cupsd.html (дата обращения: 08.06.2021).
- An Overview of the Common UNIX Printing System [Электронный ресурс]. URL: https://opensource.apple.com/source/cups/cups-87/doc/overview.html (дата обращения: 08.06.2021).
- filter(7) [Электронный ресурс]. URL: http://www.cups.org/doc/man-filter.html (дата обращения: 10.06.2021).
- Filter and Backend Programming [Электронный ресурс]. URL: http://www.cups.org/doc/api-filter.html (дата обращения: 10.06.2021).
- backend(7) [Электронный ресурс]. URL: http://www.cups.org/doc/man-backend.html (дата обращения: 15.06.2021).
- cupsd.conf(5) [Электронный ресурс]. URL: https://www.cups.org/doc/man-cupsd.conf.html (дата обращения: 08.06.2021).
- CUPS Software Administrators Manual [Электронный ресурс]. URL: https://opensource.apple.com/source/cups/cups-87/doc/sam.shtml (дата обращения: 08.06.2021).
- Using Kerberos Authentication [Электронный ресурс]. URL: https://www.cups.org/doc/kerberos.html (дата обращения: 08.06.2021).
- Printing/Developer Tools — KDE Community Wiki [Электронный ресурс]. URL: https://community.kde.org/Printing/Developer_Tools (дата обращения: 15.06.2021).
- Developing PostScript Printer Drivers [Электронный ресурс]. URL: http://www.cups.org/doc/postscript-driver.html (дата обращения: 10.06.2021).
- cairographics.org [Электронный ресурс]. URL: https://cairographics.org/ (дата обращения: 17.06.2021).
- CUPS API [Электронный ресурс]. URL: https://opensource.apple.com/source/cups/cups-327/cups/doc/help/api-cups.html#cupsGetDests (дата обращения: 19.06.2021).
- Paper Keywords and paper size in points (GNU gv Manual) [Электронный ресурс]. URL: http://www.gnu.org/software/gv/manual/html_node/Paper-Keywords-and-paper-size-in-points.html (дата обращения: 19.06.2021).