Agora resolvi esse problema. Eu adicionei a impressora real como normal, então criei um novo script de backend de cups chamado / usr / lib / cups / backend / remap:
#!/bin/bash
if [ "$#" == "0" ]; then
echo "network remap \"Unknown\" \"Username remap backend\""
exit 0
fi
DEVICE_URI=$(echo ${DEVICE_URI} | sed -e "s/^remap/ipp/")
FINAL_CONTENT_TYPE="application/vnd.cups-postscript"
PPD="<path to real printer ppd>"
PRINTER="<real printer name>"
JOBNUM=$1
USER=$(ypmatch $2 usermap)
if [ "$?" == "1" ]; then
exit 1
fi
JOBTITLE=$3
COPIES=$4
shift
shift
shift
shift
cat | /usr/lib/cups/backend/ipp ${JOBNUM} ${USER} "${JOBTITLE}" ${COPIES} "$@"
exit $?
Eu adicionei uma nova impressora falsa usando esse backend. O script presume que sua impressora falsa e a impressora real têm o mesmo local, mas um protocolo diferente, por exemplo:
- remap: // servidor: 631 / printer / printer_name
- ipp: // servidor: 631 / printer / printer_name
Substitui o "remapear" por "http" na variável de ambiente DEVICE_URI, atualiza algumas outras variáveis de ambiente, procura o usuário mapeado (nesse caso, baseado em um mapa NIS personalizado) e executa o trabalho na impressora real usando o backend ipp mas com o nome de usuário atualizado.
Os backends do Cup esperam argumentos como segue:
- $ 1: ID do trabalho CUPS
- $ 2: nome de usuário
- $ 3: cargo do trabalho
- $ 4: número de cópias solicitadas
- $ 5: opções de trabalho de impressão
- $ 6: arquivo de trabalho de impressão (com caminho)
Se $ 6 estiver vazio, ele espera entrada de stdin.