2021/02/21

Lidiando con un scanner

Quiero usar un scanner Cannon Lide 300 que dice ser soportado por sane pero no es visto, prefiero no instalar nada o lo menos posible del fabricante.

No es tanto para evitar un troyanito, con mi conocimiento y el análisis que estoy haciendo, probablemente pasaría por debajo del radar, es sólo puro orgullo, hacer andar algo bajo mis reglas.

Voy a mostrar sin explicar mucho como se usa un poco de sane, lsusb, dpkg, file, ldd, apt, strace para comprender el proceso de instalación.

El objetivo, fallido, es no usar el programa de Cannon.


Lo primero que hice fue:

sane-find-scanner


could not open USB device 0x1d6b/0x0001 at 004:001: Access denied (insufficient permissions)
could not open USB device 0x046d/0xc534 at 003:002: Access denied (insufficient permissions)
could not open USB device 0x1d6b/0x0001 at 003:001: Access denied (insufficient permissions)
  # No USB scanners found. If you expected something different, make sure that...


Es razonable, veamos con sudo

sudo sane-find-scanner


found USB scanner (vendor=0x04a9 [Canon], product=0x1913 [LiDE 300]) at libusb:001:004
  # Your USB scanner was (probably) detected. It may or may not be supported by
  # SANE. Try scanimage -L and read the backend's manpage.



Hagámosle caso:

sudo scanimage -L

tras un ratito...

No scanners were identified.


Ya estoy seguro de dos cosas, quizás sane si, pero linux no sabe que hacer con el scanner o cómo hacerselo llegar, eso es udev.

Y además puede ser que haga falta un driver.

Sigamos dando vueltas por ahí, a ver que pasa en /dev

find /dev > antes.txt

conectar

find /dev > despues.txt

comparar

diff antes.txt  despues.txt

12a13
> /dev/vboxusb/001/004
120a122
> /dev/char/189:3
384a387
> /dev/bus/usb/001/004



Ok, vemos que probablemente virtualbox está disponibilizándolo para una virtual



lsusb
Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 004: ID 04a9:1913 Canon, Inc.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub


un poco más de detalle:

lsusb -v -s 001:004

trae información y por stderr dice

Couldn't open device, some information will be missing

ya habíamos tropezado con esa piedra:

sudo lsusb -v -s 001:004


Entre otra cosas dice:

iManufacturer           1 Canon
iProduct                2 LiDE 300
iSerial                 3 46D4C3

Sólo faltaría conseguir los drivers y apuesto que tiene que haber unas reglas de udev

Tras bajar el instalador y descomprimir el instalador, con

dpkg -x scangearmp2-3.70-1-deb/packages/scangearmp2_3.70-1_amd64.deb  .

podemos ver el interior y confirmar las sospechas:

./usr
./usr/lib
./usr/lib/libcncpnet2.so.1.2.4
./usr/lib/bjlib
./usr/lib/bjlib/canon_mfp2_net.ini
./usr/lib/bjlib/canon_mfp2.conf
./usr/lib/libcncpnet30.so.1.0.0
./usr/lib/libcncpnet20.so.1.0.0
./usr/lib/libcncpmslld2.so.3.0.0
./usr/bin
./usr/bin/scangearmp2
./usr/share
./usr/share/scangearmp2
./usr/share/scangearmp2/scangearmp2.glade
./usr/share/doc
./usr/share/doc/scangearmp2
./usr/share/doc/scangearmp2/LICENSE-scangearmp-3.70SC.txt
./usr/share/doc/scangearmp2/LICENSE-scangearmp-3.70EN.txt
./usr/share/doc/scangearmp2/changelog.Debian.gz
./usr/share/doc/scangearmp2/LICENSE-scangearmp-3.70FR.txt
./usr/share/doc/scangearmp2/LICENSE-scangearmp-3.70JP.txt
./usr/share/doc/scangearmp2/copyright
./usr/share/locale
./usr/share/locale/zh
./usr/share/locale/zh/LC_MESSAGES
./usr/share/locale/zh/LC_MESSAGES/scangearmp2.mo
./usr/share/locale/ja
./usr/share/locale/ja/LC_MESSAGES
./usr/share/locale/ja/LC_MESSAGES/scangearmp2.mo
./usr/share/locale/fr
./usr/share/locale/fr/LC_MESSAGES
./usr/share/locale/fr/LC_MESSAGES/scangearmp2.mo
./usr/share/locale/de
./usr/share/locale/de/LC_MESSAGES
./usr/share/locale/de/LC_MESSAGES/scangearmp2.mo
./etc
./etc/udev
./etc/udev/rules.d
./etc/udev/rules.d/80-canon_mfp2.rules


Tenemos varias coas interesantes:

en /usr/share/doc archivos de documentacion


en /usr/share/locale las traducciones disponible


en /usr/share/scangearmp2 pueden haber problemas, ese .glade si mal no recuerdo es la configuración de la interfaz gráfica de la aplicación, esto podría generar instalación de dependencias, veamos...

file /usr/bin/scangearmp2

scangearmp2: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/l, for GNU/Linux 2.6.15, BuildID[sha1]=028fbac2701f687da994b21fb506a92aedb587c3, stripped



ese dinamically linked amerita un ldd:

ldd scangearmp2
    linux-vdso.so.1 =>  (0x00007ffdb31b3000)
    libgtk-x11-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libgtk-x11-2.0.so.0 (0x00007f3071b38000)
    libgdk-x11-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libgdk-x11-2.0.so.0 (0x00007f3071883000)
    libatk-1.0.so.0 => /usr/lib/x86_64-linux-gnu/libatk-1.0.so.0 (0x00007f307165e000)
    libgio-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libgio-2.0.so.0 (0x00007f30712d6000)
    libpangoft2-1.0.so.0 => /usr/lib/x86_64-linux-gnu/libpangoft2-1.0.so.0 (0x00007f30710c0000)
    libgdk_pixbuf-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libgdk_pixbuf-2.0.so.0 (0x00007f3070e9e000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f3070b95000)
    libpangocairo-1.0.so.0 => /usr/lib/x86_64-linux-gnu/libpangocairo-1.0.so.0 (0x00007f3070988000)
    libcairo.so.2 => /usr/lib/x86_64-linux-gnu/libcairo.so.2 (0x00007f3070674000)
    libpango-1.0.so.0 => /usr/lib/x86_64-linux-gnu/libpango-1.0.so.0 (0x00007f3070428000)
    libfreetype.so.6 => /usr/lib/x86_64-linux-gnu/libfreetype.so.6 (0x00007f307017e000)
    libfontconfig.so.1 => /usr/lib/x86_64-linux-gnu/libfontconfig.so.1 (0x00007f306ff3b000)
    libgobject-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0 (0x00007f306fce8000)
    libgthread-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libgthread-2.0.so.0 (0x00007f306fae6000)
    libgmodule-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libgmodule-2.0.so.0 (0x00007f306f8e2000)
    librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f306f6da000)
    libglib-2.0.so.0 => /lib/x86_64-linux-gnu/libglib-2.0.so.0 (0x00007f306f3c9000)
    libusb-1.0.so.0 => /lib/x86_64-linux-gnu/libusb-1.0.so.0 (0x00007f306f1b1000)
    libcncpmslld2.so => not found
    libcncpnet2.so => not found
    libcncpnet20.so => not found
    libcncpnet30.so => not found

    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f306ef94000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f306ebca000)
    libX11.so.6 => /usr/lib/x86_64-linux-gnu/libX11.so.6 (0x00007f306e890000)
    libXfixes.so.3 => /usr/lib/x86_64-linux-gnu/libXfixes.so.3 (0x00007f306e68a000)
    libXrender.so.1 => /usr/lib/x86_64-linux-gnu/libXrender.so.1 (0x00007f306e480000)
    libXinerama.so.1 => /usr/lib/x86_64-linux-gnu/libXinerama.so.1 (0x00007f306e27d000)
    libXi.so.6 => /usr/lib/x86_64-linux-gnu/libXi.so.6 (0x00007f306e06d000)
    libXrandr.so.2 => /usr/lib/x86_64-linux-gnu/libXrandr.so.2 (0x00007f306de62000)
    libXcursor.so.1 => /usr/lib/x86_64-linux-gnu/libXcursor.so.1 (0x00007f306dc58000)
    libXcomposite.so.1 => /usr/lib/x86_64-linux-gnu/libXcomposite.so.1 (0x00007f306da55000)
    libXdamage.so.1 => /usr/lib/x86_64-linux-gnu/libXdamage.so.1 (0x00007f306d852000)
    libXext.so.6 => /usr/lib/x86_64-linux-gnu/libXext.so.6 (0x00007f306d640000)
    libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f306d426000)
    libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f306d204000)
    libresolv.so.2 => /lib/x86_64-linux-gnu/libresolv.so.2 (0x00007f306cfe9000)
    libharfbuzz.so.0 => /usr/lib/x86_64-linux-gnu/libharfbuzz.so.0 (0x00007f306cd8b000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f3072183000)
    libpixman-1.so.0 => /usr/lib/x86_64-linux-gnu/libpixman-1.so.0 (0x00007f306cae3000)
    libpng12.so.0 => /lib/x86_64-linux-gnu/libpng12.so.0 (0x00007f306c8be000)
    libxcb-shm.so.0 => /usr/lib/x86_64-linux-gnu/libxcb-shm.so.0 (0x00007f306c6ba000)
    libxcb-render.so.0 => /usr/lib/x86_64-linux-gnu/libxcb-render.so.0 (0x00007f306c4b0000)
    libxcb.so.1 => /usr/lib/x86_64-linux-gnu/libxcb.so.1 (0x00007f306c28e000)
    libthai.so.0 => /usr/lib/x86_64-linux-gnu/libthai.so.0 (0x00007f306c085000)
    libexpat.so.1 => /lib/x86_64-linux-gnu/libexpat.so.1 (0x00007f306be5c000)
    libffi.so.6 => /usr/lib/x86_64-linux-gnu/libffi.so.6 (0x00007f306bc54000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f306ba50000)
    libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f306b7e0000)
    libudev.so.1 => /lib/x86_64-linux-gnu/libudev.so.1 (0x00007f3072349000)
    libgraphite2.so.3 => /usr/lib/x86_64-linux-gnu/libgraphite2.so.3 (0x00007f306b5ba000)
    libXau.so.6 => /usr/lib/x86_64-linux-gnu/libXau.so.6 (0x00007f306b3b6000)
    libXdmcp.so.6 => /usr/lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007f306b1b0000)
    libdatrie.so.1 => /usr/lib/x86_64-linux-gnu/libdatrie.so.1 (0x00007f306afa8000)



estamos bien, sólo faltan:

        libcncpmslld2.so => not found
        libcncpnet2.so => not found
        libcncpnet20.so => not found
        libcncpnet30.so => not found



Preguntémosle al sistema instalador a ver que dice:

dpkg -I scangearmp2_3.70-1_amd64.deb

 
Package: scangearmp2
 Version: 3.70-1
 Architecture: amd64
 Maintainer: Canon Inc. <sup-debian@list.canon.co.jp>
 Installed-Size: 668
 Depends: libatk1.0-0 (>= 1.29.3), libc6 (>= 2.7), libcairo2 (>= 1.2.4), libfontconfig1 (>= 2.8.0), libfreetype6 (>= 2.2.1), libgcc1 (>= 1:4.1.1), libglib2.0-0 (>= 2.16.0), libgtk2.0-0 (>= 2.12.0), libpango1.0-0 (>= 1.14.0) | libpango-1.0-0, libstdc++6 (>= 4.1.1), libusb-1.0-0 (>= 2:1.0.6)
 Section: graphics
 Priority: optional
 Description: ScanGear MP for Linux.
  This ScanGear MP provides scanning functions for Canon Multifunction Inkjet Printer.


mmh, necesito saber que me va a pedir, si le pido instalar y no tiene dependencias sigue de largo sin preguntar, necesito algo tipo:

apt install --simulate scangearmp2-3.70-1-deb/packages/scangearmp2_3.70-1_amd64.deb

Reading package lists... Done
Building dependency tree       
Reading state information... Done
Note, selecting 'scangearmp2' instead of 'scangearmp2-3.70-1-deb/packages/scangearmp2_3.70-1_amd64.deb'
The following NEW packages will be installed:
  scangearmp2
0 upgraded, 1 newly installed, 0 to remove and 274 not upgraded.
Inst scangearmp2 (3.70-1 local-deb [amd64])
Conf scangearmp2 (3.70-1 local-deb [amd64])



Esto sugiere que los libcncp* quizás sean lo que provée el mismo instalador y si miramos lo que ya hicimos, se confirma:

./usr/lib/libcncpnet30.so.1.0.0
./usr/lib/libcncpnet20.so.1.0.0
./usr/lib/libcncpmslld2.so.3.0.0



que era una de las cosas interesantes, sólo nos queda una por ver, lo de udev, son como 70

ATTR{idVendor}=="04a9", ATTR{idProduct}=="1828", MODE="666"
ATTR{idVendor}=="04a9", ATTR{idProduct}=="183e", MODE="666"
ATTR{idVendor}=="04a9", ATTR{idProduct}=="1844", MODE="666"
ATTR{idVendor}=="04a9", ATTR{idProduct}=="1845", MODE="666"


y si no me equivoco lo único que hace es poner los permisos para no tener que ser sudo/root


Necesitaría ver si hay algún script en el .deb

dpkg -e  scangearmp2-3.70-1-deb/packages/scangearmp2_3.70-1_amd64.deb

genera una carpeta DEBIAN

conffiles  control  md5sums  postinst  postrm

en control está lo mismo que dijo con -I

en conffiles la ruta de udev

en postinst

#!/bin/sh

if [ -x /sbin/ldconfig ]; then
    /sbin/ldconfig
fi

#reload udev rules
if [ -x /sbin/udevadm ]; then
    /sbin/udevadm control --reload-rules 2> /dev/null
    /sbin/udevadm trigger --action=add --subsystem-match=usb 2> /dev/null
fi



Excelente, lo que le está diciendo al sistema es que tome los nuevos .so y avisarle a udev de las nuevas reglas


Ha llegado el momento de actuar, poner las reglas y avisar:

sudo chown root.root ./etc/udev/rules.d/80-canon_mfp2.rules
sudo cp  ./etc/udev/rules.d/80-canon_mfp2.rules /etc/udev/rules.d
sudo /sbin/udevadm control --reload-rules
sudo /sbin/udevadm trigger --action=add --subsystem-match=usb


Mirá mamá! sin sudo!

lsusb -v -s 001:004

Bus 001 Device 004: ID 04a9:1913 Canon, Inc.
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.00
  bDeviceClass            0 (Defined at Interface level)
  bDeviceSubClass         0
  bDeviceProtocol         0
  bMaxPacketSize0        64
  idVendor           0x04a9 Canon, Inc.
  idProduct          0x1913
  bcdDevice            1.00
  iManufacturer           1 Canon
  iProduct                2 LiDE 300
  iSerial                 3 XXXXXX
  bNumConfigurations      1
  Configuration Descriptor:



Tenía la infundada esperanza de que de algún modo mágico sane ya lo viera con scanimage. Sería magia, pues con sudo ya debería haber funcionado, esto fueron sólo los permisos, quizás sea hora de leer la documentación de sane


Primero vamos a

http://www.sane-project.org/lists/sane-mfgs-cvs.html

control f, lide 300

que nos dice el backend que entiende este dispositivo:

http://www.sane-project.org/man/sane-pixma.5.html

¿Cómo hacerlo andar? Hace mucho tiempo hice andar un microteck II o III SP (SP significa Simple Pass, de cuando los scanner tenian que pasar tres veces, una vez por cada color) y me ahora me suena lo del backend, pero scanimage sólo entiende --device

scanimage --device /dev/bus/usb/001/004 -L


scanimage --device /dev/char/189:3 -L

Volviendo a la man page, dice como registrar los nombres, entiendo que

[/etc/sane.d/pixma.conf]
pixma:04A91913_46D4C3


pero nada, preguntémosle a strace a ver que archivos está leyenco scanimage

strace -eopen scanimage -L

open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
open("/usr/lib/x86_64-linux-gnu/libsane.so.1", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libdl.so.2", O_RDONLY|O_CLOEXEC) = 3
open("./dll.d", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 3
open("./dll.d/hplip", O_RDONLY)         = 4
open("./dll.conf", O_RDONLY)            = 3
open("./dll.aliases", O_RDONLY)         = -1 ENOENT (No such file or directory)
open("/etc/sane.d/dll.aliases", O_RDONLY) = -1 ENOENT (No such file or directory)



y despues un montón de /dev, precedidos de...


open("./sharp.conf", O_RDONLY)          = 27


está leyendo cada .conf de /etc/sane.d, incluyendo el amigo pixma.conf

y para cada backend:

open("/dev/bus/usb/001/004", O_RDWR)    = 96


Le pido ahora que sólo me cuente de la ruta de interés


strace  -P  /dev/bus/usb/001/004 scanimage  -L
open("/dev/bus/usb/001/004", O_RDWR)    = 9
ioctl(9, USBDEVFS_GET_CAPABILITIES, 0x558209e4f2c0) = 0
close(9)                                = 0
open("/dev/bus/usb/001/004", O_RDWR)    = 12
ioctl(12, USBDEVFS_GET_CAPABILITIES, 0x558209e4d330) = 0
close(12)                               = 0
open("/dev/bus/usb/001/004", O_RDWR)    = 15
ioctl(15, USBDEVFS_GET_CAPABILITIES, 0x558209e618f0) = 0
close(15)                               = 0



Para que no sea tanta info, comenté todos los backends en /etc/sane.d/dll.conf salvo pixma

Nada, ha llegado el momento de rendirme e instalar el software a ver si realmente anda...

dpkg -i scangearmp2-3.70-1-deb/packages/scangearmp2_3.70-1_amd64.deb

...como piña. Funciona excelente.

Si quisiera seguir, tendría que capturar el tráfico usb para ver qué está ocurriendo...

Puede ser que la máquina donde estoy instalando tenga una distro vieja. Uno de estos días, cuando haga la actualacion y tenga que reinstalar esto, veré si hay novedades.


Actualización 2021-10-18: con Linux Mint 20.2 que tiene simple-scan 3.36.3, no vale la pena usar el software de cannon pues es mejor. Pero me dí cuenta tras instalar scangear, no sé si simple-scan usa algo de lo instalado, no importa, no está de más tener los dos.





No hay comentarios:

Publicar un comentario