Кастомизация веб-интерфейса CUPS

У нас на производстве — N различных печатающих устройств. Те которые печатают на листах A4, A3 — не тема сегодняшнего разговора. А вот те, что печатают на рулонах от А1 до А0 интересуют куда больше. Часто, пользователи не знают\забывают в каком плоттере, какой размерности загружена бумага. Отсюда брак и излишние траты. И начальник озадачил меня, реализовать возможность смотреть какая бумага загружена, сколько ее осталось. Делать отдельный раздел на корпоративном интранет портале — смысла нет, мало кто будет туда смотреть. В то же время у многих открыт веб-интерфейс очередей печати принт-сервера на базе CUPS. Раньше я писал backend для него, для преобразования заданий в pdf и мне понравилась его гибкость. Решено было добавить необходимую информацию прямо туда. И сейчас я расскажу, о некоторых его плюшках, которые мало кто использует.

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

Теперь самое главное, как вставить их в CUPS. Сначала надо понять, как организован сам интерфейс и его возможности.
Было выяснено, что шаблоны веб-интерфейса лежат тут — /usr/share/cups/templates/ru/, а сам корень веб-сервера тут /usr/share/cups/www. Шаблоны представляют собой обычный html с включениями инструкция для шаблонизатора. Ага, теперь статичный контент я править могу (http://www.cups.org/documentation.php/doc-1.4/translation.html), но этого крайне мало. Нужен механизм инклюда внешних файлов, SSI или CGI не суть важно.

Стал читать документацию — и нашел — http://www.cups.org/documentation.php/doc-1.4/cgi.html ! Дальше уже все просто, создал файл с опеределением MIME типов — /etc/cups/cgi.types

application/x-httpd-cgi cgi
application/x-httpd-java class
application/x-httpd-perl pl
application/x-httpd-php php
application/x-httpd-python py

и подключил в шаблон /usr/share/cups/templates/ru/printers.tmpl вывод в iframe моего скрипта.

{#printer_name=0?:
{[printer_name]}
<table class="list" summary="Список принтеров">
<thead>
<tr>
<th><a href="{THISURL}?QUERY={?QUERY}&amp;WHICH_JOBS={?WHICH_JOBS}&amp;FIRST={FIRST}&amp;ORDER={ORDER=dec?asc:dec}">{ORDER=dec?<small>▲</small> Очередь <small>▲</small>:<small>▼</small> Очередь <small>▼</small>}</a></th>
<th>Описание</th>
<th>Расположение</th>
<th>Драйвер</th>
<th>Статус</th>
<th>Формат бумаги</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="{printer_uri_supported}">{printer_name}</a></td>
<td>{printer_info}</td>
<td>{printer_location}</td>
<td>{printer_make_and_model}</td>
<td>{printer_state=3?В ожидании:{printer_state=4?Печатает:Приостановлен}}{printer_state_message?: {printer_state_message}:}</td>
<td>{printer_name=hpdj4001?<iframe src="/parser.pl?4001" width="300" height="70px" frameborder="0" marginwidth="0" marginheight="0" seamless=""></iframe>:}
{printer_name=hpdj4000?<iframe src="/parser.pl?4000" width="300" height="70px" frameborder="0" marginwidth="0" marginheight="0" seamless=""></iframe>:}
{printer_name=hpdjt1100ps?<iframe src="/parser.pl?1100" width="300" height="70px" frameborder="0" marginwidth="0" marginheight="0" seamless=""></iframe>:}</td>
</tr>
</tbody>
</table>
}

Результат, как говориться, на лицо.

custom_cups