Imprimiendo de nuevo utilizando código de departamento desde Linux en impresoras Toshiba e-studio

Pues no. NO es tan sencillo como configurar las opciones de la impresora con el número de departamento que corresponda. La sesión de usuario del sistema es única y genérica para todos los docentes (usuario «profesor»), por lo que comparten escritorio y configuraciones en cada ordenador.  Aunque luego se trabaja con credenciales personales la configuración de las impresoras quedaría con el último código introducido por el profesor: Si no lo «limpian» o cierran la sesión el siguiente «listo» cargará la copias a la cuenta del anterior.

En MsWindows y utilizando los drivers empresariales funciona: dejar el código en blanco fuerza la aparición de un diálogo del sistema instándote a introducirlo cada vez que imprimes algo. Desde Linux no existe esa funcionalidad, así que me puse creativo…

Solución: utilizar el procesado de «filtros» del subsistema de impresión CUPS para incrustar un script que forzara la petición al usuario de su código de la impresora y lo sustituyera en el archivo a imprimir. La verdad es que venía funcionado sin problema desde hace 10 años pero en septiembre de 2024 dejó de hacerlo. Dejo a cualquier interesado una solución provisional (adapta las variables XAUTHORITY, XDG_RUNTIME_DIR y DBUS_SESSION_BUS_ADDRESS a tu usuario)

#!/bin/bash

# DESCRIPCIÓN: Filtro para la solicitud del código de departamento al imprimir
# MODELO:      Diseñado para las impresoras Toshiba e-studio 
# AUTOR:       David Martín Pascual  <davidmartin@colegiopablovi.es>
# VERSIÓN:     2.3 - 10 de octubre de 2024
# DEPURACIÓN:  /var/log/cups/error_log
# PARÁMETROS:  NºTrabajo, Usuario, Título, NºCopias, Opciones, [ archivo ]

# REQUIERE:
#     Tener instalado zenity (apt-get install zenity)
#     Autorizar a los usuarios 'root' y 'lp' a acceder a la sesión gráfica
#         añadiendo 'xhost +si:localuser:lp +si:localuser:root' al fichero
#         '/etc/X11/35x11-common_xhost-local'
#     Configurar el uso de este script como filtro en el fichero PPD de la
#         impresora (están en /etc/cups/ppd/) añadiendo la siguiente línea
#         '*cupsFilter: "application/vnd.cups-postscript 0 /usr/lib/cups/filter/depcode"'
#         antes de la sección 'Installable Option'
#     Copiar este fichero 'depcode' a la carpeta '/usr/lib/cups/filter' con el
#         mismo propietario y permisos que el resto de ficheros allí contenidos.
#     Configurar la impresora para utilizar el 'Código de Departamento' y
#         asignarle como valor por defecto '00000' o no lo pedirá de forma interactiva.
#     Reiniciar el servicio CUPS y la sesión del usuario antes de probar.

# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License at <http://www.gnu.org/licenses/> for
# more details.


export DISPLAY=":0.0"
export XAUTHORITY="/home/profesor/.Xauthority"
export XDG_RUNTIME_DIR="/run/user/1000"
export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus


# Al generarse un error emitimos el mensaje apropiado
function ControlError() {
    CODIGO_ERROR=$?
    echo "DEBUG depcode: Nº[$1], Usu[$2], Tít[$3], Cop[$4], Opc[$5], Err[$CODIGO_ERROR]" >&2
    if [ $CODIGO_ERROR -gt 0 ] ; then
        case $CODIGO_ERROR in
             2) TEXTO="Cancelado por el usuario" ;;
             3) TEXTO="El código bebe contener exactamente 5 dígitos" ;;
             4) TEXTO="El código bebe contener sólo números" ;;
             5) TEXTO="El código introducido no es correcto" ;;
           143) TEXTO="Cancelado desde la cola de impresión" ;;
             *) TEXTO="ERROR nº: $CODIGO_ERROR" ;;
        esac
        zenity --error --title="Impresora" --text="$TEXTO" --display=:0
        exit 1
    fi
    exit 0
    }
trap 'ControlError $1' 0 1 2 3 15


# Obtención del código de impresión a través de un formulario emergente
CODIGO=`zenity --password --title="Código de impresión" 2>/dev/null`
[ $? -eq 1 ] && exit 2
[ ${#CODIGO} -ne 5 ] && exit 3
[ -z "${CODIGO##*[!0-9]*}" ] && exit 4
[ "$CODIGO" == "00000" ] && exit 5
DC1=`echo ${CODIGO} | cut -c1`
DC2=`echo ${CODIGO} | cut -c2`
DC3=`echo ${CODIGO} | cut -c3`
DC4=`echo ${CODIGO} | cut -c4`
DC5=`echo ${CODIGO} | cut -c5`
SDC1="s/DCDigit1 0/DCDigit1 ${DC1}/g"
SDC2="s/DCDigit2 0/DCDigit2 ${DC2}/g"
SDC3="s/DCDigit3 0/DCDigit3 ${DC3}/g"
SDC4="s/DCDigit4 0/DCDigit4 ${DC4}/g"
SDC5="s/DCDigit5 0/DCDigit5 ${DC5}/g"


# Procedemos a la inserción del nuevo código en el fichero (o desde stdin)
if [ -f "$6" ] ; then
    sed -e "${SDC1}" -e "${SDC2}" -e "${SDC3}" -e "${SDC4}" -e "${SDC5}" $6
else
    sed -e "${SDC1}" -e "${SDC2}" -e "${SDC3}" -e "${SDC4}" -e "${SDC5}" -
fi