"Después del juego es antes del juego"
Sepp Herberger

martes, 18 de diciembre de 2018

Compartir impresora de CUPS mediante Google CloudPrint

1. Impresión en Cloudprint.

Una de las impresoras que tenemos en nuestros centros es la Epson WorkForce WF8590, la cual tiene en su firmware la capacidad de ser compartida en la nube de forma ubicua a través de Google CloudPrint. Tan solo hay que configurar a través de su interfaz web la cuenta de Google que la compartirá y ya la tenemos disponible en Internet.

Una vez hecho esto para la Epson sucede que tarde o temprano te piden compartir otras impresoras del centro con el problema de que no tienen en su firmware esa funcionalidad. Cuando te documentas ves que es posible compartir impresoras que están en un servidor CUPS de Linux en Google CloudPrint como si tuvieran esa funcionalidad de forma nativa, como explican aquí. Vemos que para Linux hay dos paquetes que hacen esto:

2. Paquete cloudprint.

Este programa es el más antiguo, consta de 2 paquetes Debian: cloudprint y cloudprint-service, con el software y el servicio que lo encapsula respectivamente.

Al iniciar el servicio o ejecutar a mano el programa cloudprint (tal como se relata en el apartado correspondiente) nos pedirá las credenciales de las cuentas Gmail donde asociar la impresora. Si en este paso da error 403/404 o similar esto es debido a que la versión que estamos usando es demasiado antigua (para Debian Jessie en los repositorios tenemos la obsoleta versión 0.11.5). La solución es bajar la última vérsion desde este repositorio, donde tenemos la 0.14.5 para Jessie.

Una vez resuelto esto, al arrancar el programa este intenta compartir en la nube todas las impresoras que hay en el CUPS de la máquina. Eso genera un problema si hay impresoras configuradas con el driver raw (el cual no tiene ppd asociado) y dará errores aleatorios, que harán que unas veces funcione y otras no, del tipo:
Traceback (most recent call last):
File "/usr/bin/cloudprint", line 9, in 
load_entry_point('cloudprint==0.14', 'console_scripts', 'cloudprint-cmd')()
File "/usr/share/cloudprint/cloudprint/cloudprint.py", line 620, in main
ppd, description = get_printer_info(cups_connection, name)
File "/usr/share/cloudprint/cloudprint/cloudprint.py", line 372, in get_printer_info
ppd_path = cups_connection.getPPD(printer_name)
cups.IPPError: (1030, 'No encontrado')
Lo conveniente es no tener ese tipo impresoras con driver raw en la máquina desde donde se ejecuta el programa...

Una vez resuelto esto, cuando parece que ya nada puede fallar resulta que al arrancar el programa nos dice:
Establishing connection to xmpp server talk.google.com:5223
ERROR: Could not Connect to Cloud Service. Will Try again in 60 Seconds
La causa de esto es que los chicos de Telefónica nos tienen capado el puerto 5223 de salida y por tanto el servicio no puede comunicarse con Google. Este último obstáculo me hace tirar la toalla y probar con el siguiente software, aunque seguramente fuera de la red educativa si funcionará todo esto.

3. Paquete cloud-print-connector.

Este paquete es mas moderno, tanto que no está en los repositorios de los Debian/Ubuntu mas viejunos. Pero no problem: aunque no hay versión del paquete para Jessie si la hay para Buster y si bajamos el .deb de este enlace veremos que se puede instalar sin problema:
# wget http://ftp.us.debian.org/debian/pool/main/g/google-cloud-print-connector/google-cloud-print-connector_1.12-1+b1_amd64.deb
# dpkg -i google-cloud-print-connector_1.12-1+b1_amd64.deb
# apt-get -f install
Esto es debido a que sus dependencias son bastante relajadas y no necesita versiones muy modernas de los paquetes dependientes, lo cual facilita su integración en sistemas mas antiguos. Supongo que para Ubuntu sucederá algo similar.

Un vez instalado, lo iniciamos a mano tal como cuentan aquí con:
# gcp-connector-util init
Esto nos mostrará unas instrucciones que nos llevan a abrir una página web (con Google Chrome, please) y meter un código de validación en ella. Esto vinculará las impresoras del CUPS de esa máquina con la cuenta de Gmail en la que nos autentiquemos y desde esa cuenta ya podremos imprimir o compartir la impresora hacia otras. El programa que realiza la conexión se arranca:
# gcp-cups-connector &
Pero, claro no es cuestión de arrancarlo a mano cada vez que se reinicie la máquina. Es mas sencillo crear un servicio (el paquete no lo trae, así que lo hacemos a mano):
# cat /etc/systemd/system/cloud-print-connector.service
# Copyright 2016 Google Inc. All rights reserved.
#
# Use of this source code is governed by a BSD-style
# license that can be found in the LICENSE file or at
# https://developers.google.com/open-source/licenses/bsd

[Unit]
Description=Google Cloud Print Connector
Documentation="https://github.com/google/cloud-print-connector"
After=cups.service avahi-daemon.service network-online.target
Wants=cups.service avahi-daemon.service network-online.target

[Service]
ExecStart=/usr/bin/gcp-cups-connector -config-filename /root/gcp-cups-connector.config.json
Restart=on-failure
User=root

[Install]
WantedBy=multi-user.target
Asumimos que /root/gcp-cups-connector.config.json ha sido creado con el "gcp-connector-util init" de antes. Después damos los permisos correctos y activamos el servicio:
# chmod 664 /etc/systemd/system/cloud-print-connector.service 
# systemctl enable cloud-print-connector.service
# systemctl start cloud-print-connector.service
# systemctl status cloud-print-connector.service
Tras varios reinicios se puede comprobar que el servicio funciona correctamente y las impresoras se conectan sin problema a la nube a través de él. Esta vez el firewall de la red educativa no da problemas, por lo que he supuesto usa otros puertos no bloqueados por el firewall corporativo.

4. Otra vuelta de tuerca: traer la impresora de la nube a un CUPS local.

Hemos visto como compartir en la nube las impresoras que están en el CUPS de una máquina. Ahora veremos brevemente como conectar a el CUPS de otro host (por ejemplo un portátil o una máquina que haya en otra sede o en casa) una impresora que está en la nube. La idea es CUPS maquina local-> Google CloudPrint -> CUPS maquina remota.

El conectar la impresora de la nube en un CUPS local nos permite imprimir en ella desde cualquier aplicación, no sólo estaremos limitados a la aplicaciones web de Google.

En esta parte no me voy a prodigar mucho, pongo un enlace y listo: este software. Para Windows tenemos este otro.



Voy a recomendar un excelente podcast sobre ciencia al que me he enganchado hace poco hecho en Canal Extremadura Radio: Principio de Incertidumbre. Es una gozada que nuestros impuestos se inviertan en algo útil e importante.

3 comentarios:

  1. Hola,
    Podrías ayudarme con el Tea4cups? Quiero hacer un script para preguntar al usuario. Gracias

    ResponderEliminar
    Respuestas
    1. Hola, podría ayudarte aunque este post no va de eso... ¿Qué es lo que quieres hacer exactamente?

      Eliminar
  2. Gracias Alfonso por tu labor.
    Ya lo tengo funcionando :)

    ResponderEliminar