Cups y smbclient

De zerutek

Saltar a: navegación, buscar
RECORDATORIO
Esto es el típico recordatorio, una anotación en un papel que siempre extravías.
Fuera de su contexto puede no tener ningún sentido.


22/05/2015

Imprimir vía smbclient

Las opciones que nos proporciona Cups para imprimir en windows, suelen pasar por utilizar "smbspool", un proceso que puede no cubrir nuestras expectativas.

En nuestro caso necesitamos configurar la impresora con unas credenciales en un fichero, por lo que nos interesa utilizar smbclient.

El fichero de credenciales

Es el fichero donde almacenaremos el dominio, usuario y password para utilizar la impresión. Lo ubicaremos, con el siguiente formato, en:

/etc/samba/printing.auth
domain=DOMINIO
username=Usuario
password=Password

Comprobar que el fichero de credenciales funciona

Podemos usar smbclient para comprobar que el fichero de credenciales funciona correctamente. Si disponemos de una plantilla de de impresión en formato ps, test.ps, podemos incluso comprobar que la impresora funciona correctamente.

$ smbclient -A /etc/samba/printing.auth //MiServidorDeColas.DOMNIO/ColaDeImpresión
Domain=[DOMiNIO] OS=[Windows Server 2003 3790 Service Pack 2] Server=[Windows Server 2003 5.2]
smb: \> print test.ps
printing file test.ps as test.ps
23456 bytes printed

El backend de Cups para smbclient

Generamos el script que va a actuar como backend de Cups. Lo ubicaremos en:

 /usr/lib/cups/backend/smbc
#!/bin/sh

if [ "$1" = "" ]; then
	# list supported output types
	echo 'network smbc "Unknown" "Windows Printer using smbclient"'
	exit 0
fi

job="$1"
account="$2"
title="$3"
numcopies="$4"
options="$5"
filename="$6"

if [ "$filename" = "" ]; then
	filename=-
fi

# strip protocol from printer
printer=`echo "${DEVICE_URI}" | sed 's/^.*://'`

# and print using smbclient
echo "NOTICE: smbclient -N -A /etc/samba/printing.auth -c \"print ${filename}\" \"${printer}\"" 1>&2

errtxt=`smbclient -N -A /etc/samba/printing.auth -c "print ${filename}" "${printer}" 2>&1`
ret=${?}


#
# Handle errors
#   see backend(7) for error codes

# log message
if [ "$ret" = "0" ]; then
	echo "$errtxt" | sed 's/^/NOTICE: /' 1>&2
else
	echo "$errtxt" | sed 's/^/ERROR: /' 1>&2
fi

# "NT_STATUS_LOGON_FAILURE" -> CUPS_BACKEND_AUTH_REQUIRED
echo "$errtxt" | grep -i 'LOGON_FAILURE' >/dev/null && return 2
# "Unable to open credentials file!" -> CUPS_BACKEND_AUTH_REQUIRED
echo "$errtxt" | grep -i 'credentials' >/dev/null && return 2
# "NT_STATUS_BAD_NETWORK_NAME" -> CUPS_BACKEND_STOP
echo "$errtxt" | grep -i 'BAD_NETWORK_NAME' >/dev/null && return 4

# something went wrong, don't know what -> CUPS_BACKEND_FAILED
[ "$ret" != "0" ] && return 1

# success! -> CUPS_BACKEND_OK
return 0

Y le ponemos los permisos adecuados:

chown root:root /usr/lib/cups/backend/smbc
chmod u=rwx,go=r /usr/lib/cups/backend/smbc

Configurar Cups

Ahora solo nos falta configurar cups. Cuando añadamos impresora, hay que seleccionar Windows Printer using smbclient, y configurar los datos de la impresora, quedando algo parecido a:

smbc://MiServidorDeColas.DOMNIO/ColaDeImpresión

Referencias