Veamos como compartir una impresora en una red via CUPS. Una tarea bastante trivial, sin embargo cada vez que lo hago me demoro leyendo la documentacion de CUPS. Esta vez realice el paso extra de documentar en esta guia rapida.

Compartir una impresora via CUPS nos sirve en los casos en que todas nuestras maquinas esten corriendo GNU/Linux. La ventaja de CUPS es que una vez configurado correctamente en el servidor, podemos agregar una nueva maquina ( corriendo GNU/Linux ) a nuestra red, y ya tendra la impresora configurada automaticamente, en general sin ningun paso extra, todo gracias al protocolo IPP (Internet Printing Protocol ) utilizado por CUPS.

La documentacion de CUPS es bastante extensa y a veces una tarea sencilla se complica.

Ejemplo Configuracion simple de CUPS

Para el ejemplo, supongamos los siguientes hosts:

Ejemplo: **

  • Servidor de impresion: maby-desktop 192.168.2.2
  • Cliente: seba-desktop 192.168.2.100 ** En archivo hosts del cliente agregar el nombre del servidor:

/etc/hosts

192.168.2.2 maby-desktop

En el servidor, modificar: /etc/cups/cupsd.conf NOTA: Con letra negrita: las modificaciones efectuadas al archivo original:

El archivo /etc/cups/cupsd.conf

LogLevel warning

# Administrator user group… SystemGroup lpadmin

# Only listen for connections from the local machine. Listen localhost:631 Listen /var/run/cups/cups.sock

#

Listen 192.168.2.2:631

# Show shared printers on the local network. # Browsing Off Browsing On BrowseOrder allow,deny BrowseAllow all BrowseAddress @LOCAL ### Envia informacion a los host que se alcancen desde la interface eth1 ### specifies an address to send browsing information to. The @IF(name) name will broadcast to the named interface. BrowseAddress @IF(eth1)

** ### Especificar un host en particular ###BrowseAddress 192.168.2.100:631 </p>

### con terminacion .255 broadcastea a toda una subred BrowseAddress 192.168.2.255:631 </strong>

# Default authentication type, when authentication is required… DefaultAuthType Basic

# Restrict access to the server…

Order allow,deny

#

Allow all </Location>

# Restrict access to the admin pages… <Location /admin> Order allow,deny

#

Allow all </Location>

Reiniciando el servidor CUPS

Luego de realizar los cambios, hay que reiniciar el servicio CUPS en el servidor para que los cambios surtan efecto:

/etc/init.d/cupsys restart

observar si hay mensajes de error:

**/var/log/cups/error_log **

Luego, en la PC cliente abrir un browser y navegar:

http://localhost:631/printers/

y tiene que aparecer automaticamente la impresora del servidor: ejemplo:

Description: Lexmark Z42 Location: Local Printer Printer Driver: Lexmark Z42 Foomatic/drv_z42 (recommended) on maby-desktop Printer State: idle, accepting jobs, not published. Device URI: ipp://maby-desktop:631/printers/Lexmark_Z42_USB_1

Por ultimo, Hacer una prueba de impresion desde el host cliente.

Apendice

Problemas y soluciones

Problema

En archivo /var/log/cups/error_log del host cliente:

E [22/Nov/2008:16:31:27 -0200] PID 28809 (/usr/lib/cups/backend/ipp) stopped with status 4! E [22/Nov/2008:16:31:27 -0200] [Job 1] No se ha podido localizar la impresora ‘maby-desktop’. E [22/Nov/2008:16:31:27 -0200] PID 28810 (/usr/lib/cups/backend/ipp) stopped with status 4!

Solucion

Configurar el nombre e IP del host servidor en el archivo /etc/hosts del cliente.

Problema

En archivo /var/log/cups/error_log del host cliente:

E [22/Nov/2008:16:37:38 -0200] [Job 1] No se ha podido obtener el estado de la impresora (Forbidden). E [22/Nov/2008:16:37:48 -0200] [Job 1] No se ha podido obtener el estado de la impresora (Forbidden). E [22/Nov/2008:16:37:58 -0200] [Job 1] No se ha podido obtener el estado de la impresora (Forbidden).

Solucion Este problema ocurre cuando no estan configuradas correctamente las clausulas Allow dentro de Location.

Formato de la clausula Allow

La directiva Allow especifica el nombre de host, direccion IP o Red la cual es permitida el acceso al servidor. Las directivas Allow son acumulativas, asi que multiples Allow pueden ser usadas para permitir acceso para multiples hosts o redes.

<Location /path> … Allow from All Allow from None Allow from .domain.com Allow from .domain.com Allow from host.domain.com Allow from nnn. Allow from nnn.nnn.* Allow from nnn.nnn.nnn.* Allow from nnn.nnn.nnn.nnn Allow from nnn.nnn.nnn.nnn/mm Allow from nnn.nnn.nnn.nnn/mmm.mmm.mmm.mmm Allow from xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx Allow from @LOCAL Allow from @IF(name) </Location>

En el ejemplo he usado la directiva Allow all, pero por razones de seguridad es conveniente restringir la red o subred a la cual se le da acceso siguiendo el formato previamente presentado.

La documentacion completa puede hallarse en: http://localhost:631/help/ref-cupsd-conf.html o en la pagina oficial: http://www.cups.org/