Перехват заданий печати на CUPS (виртуальный принтер на Python)

Задача — все поступающие задания на принтер перехватывать, сохранять в том виде, в котором они пришли, анализировать, раскидывать по другим принтерам.
В данной статье будет рассмотрено создание виртуального принтера, перехват, сохранение, и пример печати сохраненных задач на выбранный принтер.
Анализ поступивших файлов, разбор, мониторинг через WEB рассмотрен будет в других статьях.

Перехват печати CUPS

Общий процесс работы будет такой: клиенту подключается виртуальный принтер (с любым существующим драйвером), задание на печать уходит на этот принтер.

На CUPSе это задание передается сокетному серверу, написанному на Python, единственная задача которого получить в неизменном виде поступившее задание, сохранить его и дать поработать другим процессам.

Для начала давайте создадим файл настроек (все файлы хранятся в «/opt/projects/printing/core/»):

config.py

В настроечном файле (выше) мы указали структуру директорий, а так же указали сокетному серверу слушать только localhost на порту 9999 — так как все задания сервер будет получать через CUPS, доступ извне нам тут не нужен.

Так же мы указали настройки логирования — в процессе отладки они нам здорово пригодятся. Создадим файл конфигурации для логгера:

logging.conf

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

Теперь пора написать самого демона — благодаря Python, много строк это не займет. Создадим файл  vprinter.py

Этот скрипт слушает localhost на порту 9999, и все поступившие задания скидывает в директорию INC_TASKS_DIR (которую мы указали в конфиге), в качестве имени указывая текущую дату/время в формате UNIX (число прошедших секунд с начала Эпохи), и постфиксом добавляет _10000 или выше, если такой файл уже есть в этой директории.

Теперь, когда у нас есть скрипт, пора завести на капсе принтер, который будет переправлять задания на этот демон (причем, если даже демон будет погашен, CUPS будет пытаться переправить ему задания до последнего). От привилегированного  пользователя выполняем в консоли:

Проверим:

Для того, что бы печатать откуда-либо, надо на машине клиента подключить принтер dummy с сервера CUPS — из Windows 8.1, например, это делается так:

При установке принтера нажимаете «Нужный принтер отсутствует в списке»

p1

Потом указывается адрес принтера (его можно посмотреть на сервере CUPS), никакого обзора, просто нажимаете далее:

p2

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

p3

И, завершая статью, небольшой скрипт, который из выбранной директории будет печатать все файлы на указанный (настоящий принтер). Если печать прошла успешно, файл будет помещен в архив (в той же директории ./arch ). Скрипт использует тот же файл настроек config.py и логгера logging.conf, что мы создали в первой половине статьи. В данном случае подразумевается, что все поступившие файлы мы разобрали, привели к подобающему виду и выложили для печати в папку asis (печатать, как есть). Данная директория задается в настроечном файле. Тут для эксперимента я добавил в CUPS сетевой принтер HP3015 под именем HP3010, и захардкодил его в скрипт. Вам придется отдельно поставить свой принтер (как это сделать, полно мануалов), и в скрипте заменить HP3010 на имя принтера, который вы добавили .

Проверим?

Задача выполнена, всем удачных экспериментов, оставляйте вопросы и замечания в комментариях, буду рад обратной связи!

Связанные посты

How to Click «OK» when a win popup distu... There was a little problem at my work, when some popup windows were needed to be closed to continue work, but some people forgot to press them. So her...
Prevent windows session from logout Well, if you can't change your logout setting due to some reasons (such as a nasty sysadmin), you can use easy vbs script. So: Create a new file ...
Installing oracle client in Ubuntu server Install RPMs Download the Oracle Instantclient RPM files from //www.oracle.com/technetwork/database/features/instant-client/index-097480.html. Eve...
How to find all files in a current directory creat... Very simple! All you need is to change some of the options in the head of the script:    
Fedora 17 quick settings Enabling wi-fi for İntel corporation device 088e: Enabling flash: some say that you need to perform but I didn't need it
Oracle Database 11g Release 2 (11.2) Installation ... Tnank you, guys! This article describes the installation of Oracle Database 11g Release 2 (11.2) 64-bit on Fedora 17 (F17) 64-bit (works for 32-bit...
Creating a custom Swap File To add a swap file: Determine the size of the new swap file in megabytes and multiply by 1024 to determine the number of blocks. For example, ...
Ubuntu Server To change keyboard layout: To get essential header files (such as  ) To get additional man pages:
VirtualBox autostart in background (Win 7) Add path to your VirtualBox installed folder to Environment Variables   Then open your startup folder. You may get ther...
Win 7 Turn WIN7 theme off (when windows doesn't want to) Setup e-mail account (when Outllok (2007) doesn't work and there's no e-mai icon in Control Pane...
How to rename file names in Windows using a patter... Occasionally you need to rename a heap of photos or mp3 files or movies, in order to use it with something different - mp3 player or e-reader or somet...
Import Red Hat vdi to KVM under Ubuntu All of us knows VMware and VirtualBox solutions, and they do their job quite good.. But there is an open-source product, supported by Red Hat and IBM ...
Oracle 11g: Copy tables to another database, using... Times are tough nowadays. You can't rely on an only instance of your database and redundancy is a world of a century, probably, but the truth is: you ...
Устанавливаем MongoDB на Red Hat 5.8... Приятно, что MongoDB идет уже в установочном пакете, особо возни не намечалось, цель была установить и проверить что работает, пока без тюнинга и наст...
Восстановить оболочку рута Если ты настолько болен, что додумался поменять   и прописать вместо оболочки какую-то шляпу то при загрузке GRUB нажимаешь e, находишь строку с...