# Common Unix Printing System

Common Unix Printing System (Sistema de impresión común de Unix, abreviado CUPS) es un sistema de impresión modular para sistemas operativos de tipo Unix que permite que un computador actúe como servidor de impresión. Un computador que ejecuta CUPS actúa como un servidor que puede aceptar tareas de impresión desde otros computadores clientes, los procesa y los envía a la impresora apropiada.
CUPS está compuesto por una cola de impresión con su planificador, un sistema de filtros que convierte datos para imprimir hacia formatos que la impresora conozca, y un sistema de soporte que envía los datos al dispositivo de impresión. CUPS utiliza el protocolo IPP (Internet Printing Protocol) como base para el manejo de tareas de impresión y de colas de impresión. También provee los comandos tradicionales de línea de comandos de impresión de los sistemas Unix, junto a un soporte limitado de operaciones bajo el protocolo server message block (SMB). Los controladores de dispositivos de impresión que CUPS provee pueden ser configurados utilizando archivos de texto con formato PostScript Printer Description (PPD) de Adobe Systems. Existen varias interfaces de usuario para diferentes plataformas para configurar CUPS; cuenta también con una interfaz como aplicación Web. CUPS es software libre y se distribuye bajo licencia GNU General Public License y GNU Lesser General Public License, versión 2.

## Historia

Michael Sweet, dueño de Easy Software Products, comenzó a desarrollar CUPS en 1997. Las primeras versiones públicas beta aparecieron en 1999. El diseño original de CUPS usaba el protocolo Line Printer Daemon protocol (LPD), pero debido a limitaciones en el protocolo e incompatibilidades entre marcas, se optó cambiar por el protocolo Internet Printing Protocol (IPP). Cups fue rápidamente adoptado como el sistema de impresión por defecto en varias distribuciones Linux. En marzo de 2002, la empresa Apple Inc. adoptó CUPS como el sistema de impresión en el sistema operativo Mac OS X 10.2. En febrero de 2007, Apple Inc. empleó al desarrollador Michael Sweet y compró el código fuente de CUPS.

## Visión general

CUPS provee un mecanismo que permite que los trabajos de impresión sean enviados a impresoras de manera estandarizada. La información es enviada planificador quien envía el trabajo a un sistema de filtros que convierte el trabajo a un formato que la impresora comprende. El sistema de filtros luego envía los datos a un backend —un filtro especial que envía datos de impresora a un periférico o una conexión de red. El sistema hace un uso extensivo del lenguaje PostScript y de rasterización de los datos, para convertir los datos recibidos a un formato aceptado por la impresora.
CUPS tiene como ventaja principal ser un sistema de impresión estandarizado y modularizado, capaz de procesar diferentes formatos de datos en el servidor de impresión. Antes de CUPS, era difícil encontrar un sistema de impresión estandarizado capaz de adaptarse a la gran gama de variedades de impresoras existentes en el mercado, utilizando cada una su propio lenguaje de impresión y formatos. Como ejemplo: los sistemas de impresión de System V y de Berkeley fueron durante mucho tiempo incompatibles uno con el otro, requiriendo scripts complicados y arreglos varios para lograr convertir el formato de datos desde el programa a un formato imprimible. Normalmente no se lograba detectar el formato de archivo que estaba siendo enviado a la impresora, con lo que no se podía corregir y convertir automáticamente el flujo de datos. Además se ejecutaba la conversión de datos en cada estación de trabajo y no en un servidor central.
CUPS permite más fácilmente, a los fabricantes de impresoras y a los desarrolladores de controladores, crear controladores que funcionen nativamente en el servidor de impresión. El procesamiento ocurre en el servidor, permitiendo sistemas de impresión basadas en red mucho más sencillas que con otros sistemas de impresión Unix. Cuando es utilizado con Samba, pueden ser utilizados las impresoras en computadoras Windows remotas y controladores genéricos PostScript pueden ser utilizados para imprimir a través de la red.

### Planificador

El planificador de CUPS implementa Internet Printing Protocol (IPP) sobre HTTP/1.1. Una aplicación de ayuda (cups-lpd) convierte peticiones de LPD a IPP. El planificador también provee una interfaz web para administrar los trabajos de impresión, la configuración del servidor y para brindar documentación de CUPS mismo.
* Un módulo de autorización controla cuáles mensajes de IPP y HTTP pueden pasar a través del sistema.
* Una vez que los paquetes IPP/HTTP han sido autorizados son enviados al módulo cliente, quién escucha y atiende conexiones entrantes. El módulo cliente es también responsable de ejecutar programas CGI externos, según sea necesario para soportar impresoras web, clases y el monitoreo y administración de estado de los trabajos de impresión.
* Una vez que este módulo ha procesado sus solicitudes, las envía al módulo IPP quién ejecuta una validación de Uniform Resource Identifier (URI) previniendo que un cliente esquivar algún control de acceso o de autenticación en el servidor HTTP. El URI es una cadena de caracteres que indica un nombre o dirección que puede ser utilizada para referir un recurso -abstracto o físico- en una red.
El planificador permite la utilización de clases de impresoras. Las aplicaciones pueden enviar peticiones a grupos de impresoras en una clase, permitiendo al planificador redirigir el trabajo a la primera impresora libre de esa clase.
* Un módulo de trabajos (jobs en inglés) gestiona los trabajos de impresión, enviándolos al filtro y proceso backend para conversión final e impresión, monitoreando además los mensajes de estado provenientes de éstos procesos.
* El planificador de CUPS utiliza un módulo configuración, quien analiza archivos de configuración, inicializa las estructuras de datos de CUPS, y es quien inicia y detiene el programa CUPS. Este módulo de configuración detendrá el servicio de CUPS durante el procesamiento del archivo de configuración para luego reiniciar el servicio al finalizar el procesamiento.
* Un módulo de bitácora (logging module en inglés) se encarga de registrar los eventos de acceso, error y registros de páginas.
* El módulo principal (main en inglés) se encarga de servir las peticiones de entrada/salida a tiempo por parte de las conexiones clientes, vigilar si hay señales, manejar errores y finalizaciones de procesos hijos, y de recargar los archivos de configuración del servidor según sea necesario.
Otros módulos utilizados por el planificador son:
* el módulo Mime, encargado de una base de datos de tipos y de conversión Multipurpose Internet Mail Extensions (MIME), utilizado en el proceso de filtrado que convierte los datos recibidos a un formato adecuado para la impresora
* el módulo PPD encargado de manejar una lista de archivos PPD PostScript Printer Description
* el módulo periféricos quien administra una lista de periféricos disponibles en el sistema
* y un módulo impresoras encargado de las impresoras y PPDs dentro de CUPS.

### Sistema de filtrado

Una de las principales ventajas de CUPS es que puede procesar una variedad de formatos de datos en el servidor de impresiones. Convierte la información del trabajo de impresión al lenguaje/formato destino de la impresora a través de una serie de filtros. Lo hace utilizando tipos de MIME, siendo éste un estándar web para el formato de correo electrónico, pero muy útil para permitir que CUPS determine el tipo del archivo que está siendo procesado.

#### Base de datos MIME

Luego de que un trabajo de impresión ha sido asignado al planificador, es reenviado al sistema de filtrados de CUPS. Éste convierte los datos a un formato adecuado para la impresora. El demonio CUPS carga durante el inicio dos Bases de datos MIME:
* mime.types define los tipos de archivos conocidos, de los cuales CUPS acepta datos
* mime.convs define las aplicaciones que deben procesar cada tipo MIME en particular.
El archivo mime.types utiliza la siguiente sintaxis:
mimetype { [file-extensions] | [pattern-match] }
Por ejemplo, para detectar un archivo HTML se utilizaría la siguiente entrada:
text/html html htm \
    printable(0,1024) + (string(0,"<HTML>") string(0,"<!DOCTYPE"))
La segunda línea une el contenido del archivo al tipo MIME especificado, determinando que el primero kilobyte de texto en el archivo contiene caracteres imprimibles y que éstos incluyen html. Si el pattern de arriba es coincidente, será tildado el archivo como de tipo MIME text/html.
El archivo mime.convs utiliza la siguiente sintaxis:
source destination cost program
El campo source es el tipo MIME determinado al revisar el archivo mime.types, mientras que el campo destination lista el tipo de salida solicitada y determina qué aplicación debe ser utilizada. Esto también es obtenido desde mime.types. El campo cost asiste en la selección del conjunto de filtros al convertir el archivo. El último campo, program, determina los programas de filtros a ser utilizados para ejecutar la conversión de datos.
Algunos ejemplos:

#### Procesos de filtrados

El proceso de filtrado se ejecuta tomando como entrada datos preformateados con seis argumentos: nombre de la cola de impresión, job ID del trabajo de impresión, nombre de usuario, nombre del trabajo, número de copias, opciones de impresión, y nombre de archivo (aunque éste no es necesario si ha sido redireccionado desde entrada estándar. Luego determina el tipo de dato de la entrada y el filtro a ser usado a través del uso de la base de datos MIME. Por ejemplo datos de imagen que será detectada y procesada a través de un filtro particular y datos HTML detectados y procesados a través de otro filtro.
Esta información puede ser o bien convertido en datos PostScript o directamente en datos rasterizados. Si es convertido a PostScript, entonces es aplicado un filtro adicional llamado prefiltro, quien corre los datos PostScript a través de otro conversor PostScript para poder incluir opciones específicas de la impresora - por ejemplo rango de páginas a imprimirse, modo n-up y otras opciones específicas del periférico. Luego del pre-filtrado pueden ser enviados los datos directamente al backend de CUPS si es utilizada una impresora PostScript, o puede ser desviado a algún otro filtro como Foomatic de linuxprinting.org. Alternativamente puede ser pasado a Ghostscript, quien convierte el PostScript en un formato intermedio CUPS-raster Este formato rasterizado intermedio es luego pasado a un filtro final quien convierte los datos rasterizados en un formato específico de la impresora. Los filtro por defecto incluidos en CUPS son:
* rasterizado a PCL
* rasterizado a ESC/P o ESC/P2 (un lenguaje de impresoras Epson, ahora ampliamente superado por su nuevo formato ESC/P-Raster)
* rasterizado a Dymo (otro fabricante de impresoras)
* otros lenguajes propietarios como GDI o SPL (Samsung Printer Language) tienen soporte bajo Splix, un traductor de rasterizado a SPL.
Igualmente, hay varias otras alternativas que pueden ser utilizadas junto con CUPS. Easy Software Products (ESP), creadores de CUPS, han publicado sus propios filtros CUPS; Gutenprint (anteriormente conocido como Gimp-Print) es una gama de controladores de impresoras de alta calidad para una gran mayoría de las impresoras de chorro de tinta (inkjet), y Turbo-Print para Linux tiene otra gama de controladores de alta calidad.

### Backends

Los "backends" son las maneras en que la información es enviada a la impresora. Hay varios backends disponibles para CUPS: Puertos paralelo, serial y USB, como también a través de la red mediante los protocolos IPP, JetDirect (AppSocket), Line Printer Daemon (LPD) y SMB.

## Compatibilidad

CUPS provee comandos de impresión de System V y de Berkley, para poder utilizar los comandos tradicionales con CUPS. Escucha en el puerto 515, puerto tradicional de LPD (lo trata como un 'backend'). Cuando CUPS está instalado, se instalan los comandos lp del sistema de impresión de System V y lpr de Berkeley printing system como aplicaciones compatibles. Esto permite tener una interfaz estándar con CUPS mientras se permite máxima compatibilidad con las aplicaciones existentes que se basan en éstos sistemas de impresión.
Apple Computer está utilizando CUPS como sistema de impresión en su sistema operativo Mac OS X a partir de la versión:10.2 (Jaguar)

## Herramientas de Interfaz de Usuario

Hay varias herramientas para ayudar en la configuración de CUPS.

### Interfaz web para administrar CUPS

Para administrar CUPS se cuenta con una interfaz web que se ejecuta en el puerto 631. Extremadamente útil en organizaciones que deben monitorear trabajos de impresión y crear colas de impresión e impresoras remotamente.
CUPS 1.0 proveía una interfaz web sencilla para monitorear clases, trabajos e impresoras. CUPS 1.1 sustituyó esta interfaz con una interfaz de administración que permite agregar, modificar, eliminar, configurar y controlar clases, trabajos e impresoras.
CUPS 1.2 tiene una interfaz web modernizada, caracterizada por mejorada legibilidad y diseño, soporte a descubrimiento automático de impresoras y un mejor acceso a las bitácoras del sistema y a seteos avanzados.
CUPS 1.4 actualiza la interfaz web con un diseño más atractivo e intuitivo, agregando nuevas funciones como la capacidad de limpiar cabezales.

### GNOME

El GNOME CUPS Manager puede ser utilizado para agregar nuevas impresoras, y para administrar las impresoras CUPS con sus colas. Existen además otras aplicaciones (de terceras partes) para administrar las impresiones, por ejemplo GtkLP y su herramineta asociada GtkLPQ, o GtkPSproc.
EL grupo de bibliotecas para desarrollar interfaces gráficas de usuario (widget toolkit) llamado GTK+, sobre los cuales GNOME está basado, incluye soporte integrado de impresiones basadas en CUPS a partir de su versión 2.10, introducida en 2006.
En Ubuntu se puede acceder en Sistema / Administración / Impresoras.

### KDE

KDEPrint, para KDE, es un marco que contiene varias herramientas de interfaces gráficas de usuarios que actúa como un front-end de CUPS y permite la administración de clases, colas de impresión y trabajos. Incluye un asistente para agregar nuevas impresoras, entre otras características. Fue agregado en KDE 2.2.
KDEPrint soporta varias plataformas diferentes, entre las cuales CUPS es una de las mejores soportada. Reemplazó una versión previa de soporte de impresión en KDE, qtcups y es compatible con éste módulo de KDE. kprinter, una aplicación de cuadro de diálogo, es ahora la herramienta principal para enviar trabajos a la impresora; también puede ser arrancado desde la línea de comandos. KDEPrint incluye un sistema de prefiltrado de cualquier trabajo antes de enviarlo a CUPS; o de manejar los trabajos completamente solor (por ejemplo convertir archivos en PDF); estos filtros son descritos por una pareja de Escritorio / Archivos XML.
La primera versión es de 1999, la más reciente es la 1.2.8 de 14 de febrero de 2007
El 12 de julio de 2007, Apple Computer anunció que compró en febrero de ese año CUPS "Common Unix Printing System".
Desde Linux al propio OSX dependen de la biblioteca para imprimir. Apple ha contratado a Michael Rose para que continúe con el desarrollo y ha dicho que mantendrá la actual licencia GPL v2.