El servidor de impresión de mi red doméstica ha nacido. Y lo ha hecho a lo grande, con impresora virtual PDF y todo.

Lo he alojado en matraz.home y le he añadido la impresora láser directamente por nombre en lugar de seguir el protocolo dnssd porque empiezo a estar cansado de localizar problemas en entornos dinámicos que en realidad están grabados en piedra: la impresora es una Samsung ML-2855ND con su dirección IP fija y su entrada correspondiente en el DNS.

Después, y es la principal razón de que haya dedicado tanto tiempo hoy a esta tarea, he añadido la impresora virtual PDF. Pero no sólo eso, quería que el servicio estuviese completo:

  1. Crear una máquina en la red llamada printers.home.
  2. Instalar CUPS y acceder vía navegador
  3. Instalar una impresora virtual PDF
  4. Exportar un directorio compartido con los archivos resultantes.

Crear printers.home en la red

Esto ya estaba hecho en la empresa hace bastante y los pasos a seguir son relativamente pocos:

  1. Instalar CUPS y activar la escucha en el puerto 631 por red.
  2. Instalar Apache y los módulos proxy correspondientes.
  3. Configurar apache para que se comunique con CUPS con el envoltorio del nombre de la máquina.
<VirtualHost *:80>
   Servername printers.home  
   ServerAdmin root@home  

   LogLevel info   
   ErrorLog /var/log/apache2/printers.home/error.log  
   CustomLog /var/log/apache2/printers.home/access.log combined  

   ProxyPass / http://127.0.0.1:631/ retry=1 acquire=3000 timeout=600 Keepalive=On  
   ProxyPassReverse / http://127.0.0.1:631/ 
</VirtualHost>

Instalar impresora PDF

La configuración básica que he definido consiste en indicarle un directorio y un modo de creación de archivos, así como un par de opciones de cómo extraer el nombre del archivo y demás.

Hay unas cuantas posibilidades más para ampliar este mecanismo (como el envío automático por correo de los archivos) pero por el momento estoy satisfecho con como queda.

El archivo /etc/cups/cups-pdf.conf contiene -entre otras- las siguientes directivas:

Out /srv/pdf-printer/${USER}
AnonDirName /srv/pdf-printer
Spool /var/spool/cups-pdf/SPOOL

Truncate 64
Cut -1
Label 0
TitlePref 0

AnonUser nobody
LowerCase 1
AnonUMask 0007
UserUMask 0007
Grp lpadmin

Log /var/log/cups
LogType 3
GhostScript /usr/bin/gs
GSTmp /var/tmp
PDFVer 1.4
DecodeHexStrings 1
FixNewlines 0

La he añadido y configurado un poco en el interfaz web de CUPS y al probarla no daba error como tal pero no creaba el archivo. ¿ El problema ? apparmor activo y con un perfil predeterminado para ella.

Le he añadido el directorio donde podía leer y escribir y he reiniciado el servicio apparmor y vuelto a probar. Y entonces sí.

# separate profile since this needs to write into /home
/usr/lib/cups/backend/cups-pdf {
   ...
   capability chown,
   capability fowner,
   capability fsetid,
   capability setgid,
   capability setuid,
   ...
   /var/log/cups/cups-pdf_log w,   /var/spool/cups/* r,
   /var/spool/cups-pdf/** rw,
   /srv/pdf-printer/** rw,
}

Exportar directorio de PDF

En el montaje que tengo en el trabajo y que pocos usan ya empleaba una mezcla de NFS, montaje automático según acceso (autofs) y LDAP como directorio de usuarios. Dado que aquí aún no tengo directorios, y que como mucho lo voy a usar yo y tal vez mi hija, no me he complicado la vida y he definido un recurso compartido con Samba.

[pdf]
         comment                 = Resultados impresora PDF
         path                    = /srv/pdf-printer
         guest ok                = yes
         guest only              = yes 
         force user              = nobody
         force group             = nogroup
         read only               = no
         browseable              = yes
         hide dot files          = yes
         vfs objects             = recycle
         recycle:repository      = .borrados
         recycle:directory_mode  = 0770
         recycle:keeptree        = yes
         recycle:versions        = yes
         recycle:touch           = yes
         recycle:noversions      = .tmp,.temp,.o,.obj,.TMP,.TEMP
         recycle:exclude         = .tmp,.temp,.o,.obj,.TMP,.TEMP

La diferencia entre otros montajes es que le he añadido una papelera de reciclado que funciona muy bien. El visor de archivos thunar, por ejemplo, avisa de que el archivo se borrará para siempre pero en realidad se guarda en la papelera.

Esta queda así después de hacer un par de pruebas desde el navegador Firefox:

root@matraz:/srv# tree -a /srv/pdf-printer/
 /srv/pdf-printer/
 ├── .borrados
 │   └── Borrarse_de_Tinder___Algo_supuestamente_divertido_que_nunca_volv-job_30.pdf
 ├── cups-browsed.conf__server_configuration_file_for_cups-browsed_-_-job_31.pdf
 └── Tablas_agregadas__le-job_28.pdf
 1 directory, 3 files

Referencias