Коротко о граблях.
Делаем по основным гайдам -- качаем последний пакет capt-драйверов, подменяем init-скрипт ccpd на модифицированный исходник, создаём-разрешаем запись в /var/ccdp/fifo0, ставим принтер через lpadmin...
и тут первая грабля: -P ppd-file
Specifies a PostScript Printer Description (PPD) file to use
with the printer. Note: PPD files and printer drivers are dep‐
recated and will not be supported in a future version of CUPS.
И не работает.
Обход: через гуёвую настройку cups (Start/Preferences/Printers) нормально добавился capt-принтер. В полях для ввода пишем ccp:/var/ccpd/fifo0, имя принтера (в моём случае -- lbp2900)
Вторая грабля.Конфигуряем ccpd:
ccpdadmin -p lbp2900 -o /dev/usb/lp3
запускаем ccpd.
Получаем в выводе ccpdadmin что-то типа
CUPS_ConfigPath = /etc/cups/
LOG Path = None
UI Port = 59787
Entry Num : Spooler : Backend : FIFO path : Device Path : Status
----------------------------------------------------------------------------
[0] : lbp2900 : ccp : /var/ccpd/fifo0 : /dev/usb/lp3 :
cups работает, ccpd работает, данные на принтер не идут, в строке статуса принтера в капсе -- Простаивает/Idle – ccp send_data error, exit
Решение: ldd /usr/bin/captfilter
[spoiler]linux-gate.so.1 (0xf76eb000)
libpopt.so.0 => /usr/lib32/libpopt.so.0 (0xf76a6000)
libc.so.6 => /lib32/libc.so.6 (0xf7501000)
/lib/ld-linux.so.2 (0xf76ec000)[/spoiler]
У меня на некоторых файлах capt* были пустые места -- не установлены 32-битные пакеты (ставил драйвера 64-битные).
aptitude search cndrv
i cndrvcups-capt - Canon CAPT Printer Driver for Linux
i cndrvcups-common - Canon Printer Driver Common Modules Ver.3
По итогу решилось пачкой всякого
apt-get install lib32stdc++6 lib32z1 [b]libc6:i386 libpopt0:i386 libxml2:i386[/b]
Перезапускаем cups, перезапускаем ccpd -- работает.
up. При очередном запуске конфиг ccpd сменился, вместо /var/ccpd/fifo0 вписался usb:Canon..., тем не менее всё работает даже при отправке данных через ccp:/var/ccpd/fifo0.
Дальше копать сейчас смысла не вижу.
До кучи выкинул ccpd-init, пихнул запуск в /etc/systemd/system/ccpd.service. Только ручной запуск по включению/выключению принтера (через правило UDEV, о нём ниже), с игнорированием ошибок при создании папок-файлов перед стартом.
[Unit]
Description=ccpd: Canon Printer Daemon for CUPS
Requires=cups.service
[Service]
Type=forking
ExecStartPre=-/bin/mkdir -p /var/ccpd
ExecStartPre=-/bin/mkfifo /var/ccpd/fifo0
ExecStartPre=-/bin/chown -R lp:lp /var/ccpd
ExecStart=/sbin/ccpd
Грабля третья. udev.
Совместим немного с коротким гайдом для новичков.
Задача: поставить на включение и выключение принтера включение/выключение сервисов печати, cups и ccpd/
Решение.
Запустить lsusb, в выводе найти строчку с Canon*, в ней -- xxxx:yyyy, типа 04a9:2676. Это и будут искомые idVendor:idProduct
Создать файл 90-canon-printer.rules, вписать туда что-то типа
SUBSYSTEMS=="usb" \
ATTRS{idVendor}=="04a9" \
ATTRS{idProduct}=="2676" \
ACTION=="add" \
RUN+="/bin/systemctl start cups; /bin/systemctl start ccpd"
ACTION=="remove" \
SUBSYSTEMS=="usb" \
ATTRS{idVendor}=="04a9" \
ATTRS{idProduct}=="2676" \
RUN+="/bin/systemctl stop cups"
Скопировать его в /etc/udev/rules.d, сделать systemctl reload udev
Включаем, можно сделать udevadm test /sys/path/to/some/device/or/random/file, чисто посмотреть, есть ли ошибки в созданном и загруженном правиле.
В данном случае ошибок не было, cups/ccpd при подключении принтера запускаются, при выключении -- нет. Уже думал на какие-то недокументированные запреты в самом udev, типа не стартовать ничего с del/stop/rm без спец. ключей. Но всё оказалось проще.
Немного не этот случай, поэтому спрятано.
Через RUN+= запускаем программы с указанием полного пути к ним и только выполняющиеся быстро! Пока не прочитал руководство -- на другой железяке накололся: пока работает запущенная в run программа, следующие после неё правила не применяются. Поэтому либо пишем сервис для systemd, либо форкаем основной скрипт и закрываем родительский процесс, либо налаживаем взаимодействие с какой-то принимающей запросы службой/сервисом, который и будет запускать какое-то работающее долго ПО.
Простой дебаг.
Сбор данных.Запускаем udevadm monitor, включаем-выключаем принтер и смотрим, что куда добавляется-убирается.
Получаем длинный список с чем-то типа
Источник события [ time? ] ACTION /path/to/device/in/sys/dir (SUBSYSTEM)
KERNEL[142442.545611] remove /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.3 (usb)
После этого можем посмотреть список и значения аттрбутов по этому устройству (при действии add/bind сооветственно) руками. Не забываем дописать /sys в начале.
ls /sys/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.3
<длинный список аттрибутов и подпапок, по которым можно погулять>
cat /sys/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.3/idProduct
2676
cat /sys/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.3/idVendor
04a9
Либо заказываем udevadm показать список аттрибутов на данное устройство и убедиться, что там есть искомые idProduct/idVendor
udevadm info /sys/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.3
Либо сразу запускаем udevadm monitor --property, который выдаст список ENV{}(не ATTR)-условий, пригодных для созадания правил. Смотрим совпадения по ID_MODEL_ID/ID_VENDOR_ID.
Проверка применения правил для найденного устройства через udevadm testНе выключаем принтер, отправляем на заданное устройство имитацию действий и смотрим, что из правил применяется.
В моём случае
udevadm test --action=add /sys/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.3
This program is for debugging only, it does not run any program
specified by a RUN key.
Reading rules file: /usr/lib/udev/rules.d/39-usbmuxd.rules
<...>
Reading rules file: /etc/udev/rules.d/90-canon-printer.rules
<...>
DEVPATH=/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.3
DEVNAME=/dev/bus/usb/001/112
DEVTYPE=usb_device
<...длинный список ENV-аттрибутов. которые можно использовать для создания правил
типа ENV{DEVTYPE}=="usb_device"...>
[b]run: '/bin/systemctl start cups; /bin/systemctl start ccpd'[/b]
На добавление триггерится и действительно стартует. А на удаление?
udevadm test --action=remove /sys/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.3
<...>
Список аттрибутов есть, а run -- нет.
Заменил в правиле, работающем после ACTION=="remove" строчки ATTRS{idVendor}=="04a9" ATTRS{idProduct}=="2676" на ENV{PRODUCT}=="4a9/2676/100" (взято из вывода udevadm test --action=remove /sys/dev...), перезгрузил правила udev (systemctl reload udev) -- заработало.
Работающее сейчас правило.
#rules, for, my, canon, lbp2900, device
#start cups/ccpd when printer added, stop them
#when device removed (it's enouph to stop cups)
SUBSYSTEMS=="usb" \
ATTRS{idVendor}=="04a9" \
ATTRS{idProduct}=="2676" \
ENV{ID_MODEL}=="Canon_CAPT_USB_Device" \
ACTION=="add" \
RUN+="/bin/systemctl start cups; /bin/systemctl start ccpd"
#RUN+="systemctl start ccpd"
ACTION=="remove" \
SUBSYSTEMS=="usb" \
#ATTRS{idVendor}=="04a9" \
#ATTRS{idProduct}=="2676" \
#ENV{ID_MODEL}=="Canon_CAPT_USB_Device" \
ENV{PRODUCT}=="4a9/2676/100" \
RUN+="/bin/systemctl stop cups"
Применять одинаковое имя устройства в /dev/usb/lpПринтер установлен только один, подключен к одному и тому же usb-порту, но при каждой загрузке создаётся то /dev/usb/lp0, то /dev/usb/lp3. Не мешало бы, но в /etc/ccpd.conf указан только какой-то один адрес устройства для принтера, не совпадает -- не работает.
В моём случае удобным вариантом оказалось создание символьной ссылки /dev/usb/lbp2900 (его и указываем в /etc/ccpd.conf) на создаваемое при подключении принтера через правило udev.
#rules, for, my, canon, lbp2900, device
#start cups/ccpd when printer added, stop them
#when device removed (it's enouph to stop cups)
#https://habr.com/ru/post/268345/
SUBSYSTEM=="usb" \
ENV{PRODUCT}=="4a9/2676/100" \
ENV{ID_MODEL}=="Canon_CAPT_USB_Device" \
ENV{ID_SERIAL_SHORT}=="0000B164R9jC" \
ACTION=="add" \
GOTO="canon_rules_usbmisc"
LABEL="canon_rules_usbmisc" \
#ATTRS{idVendor}=="04a9" \
#ATTRS{idProduct}=="2676" \
ENV{DEVNAME}=="/dev/usb/lp*" \
#IMPORT{file}="/home/da/test.txt" \
#ENV{DEVPATH}=="%E{CUSTOMVAR}/*/usbmisc/lp*" \
SYMLINK+="usb/lbp2900" \
RUN+="/bin/systemctl start cups; /bin/systemctl start ccpd"
GOTO="canon_rules_end"
#change symlink from /dev/usb/lpX to /dev/usb/lbp2900
#ACTION=="add" \
#ENV{MAJOR}=="180" \
#ENV{MINOR}=="1" \
#ENV{DEVNAME}=="/dev/usb/lp*" \
#SYMLINK+="usb/lbp2900"
ACTION=="remove" \
SUBSYSTEMS=="usb" \
#ATTRS{idVendor}=="04a9" \
#ATTRS{idProduct}=="2676" \
#ENV{ID_MODEL}=="Canon_CAPT_USB_Device" \
ENV{PRODUCT}=="4a9/2676/100" \
RUN+="/bin/systemctl stop cups"
LABEL="canon_rules_end"
Важно. Указан поиск совпадений по ENV{SERIAL_SHORT}, обязательно к замене серийник своего принтера или удаление этой строки.
Файл с обновленным правилом -- *rules1.txt. При применении переименовать в *rules
Подробнее про создание правила --
дальше по ветке