# Common Unix Printing System

Common Unix Printing System (CUPS) est un système modulaire d'impression numérique pour les systèmes d'exploitation Unix et assimilés. Tout ordinateur qui utilise CUPS peut se comporter comme un serveur d'impression ; il peut accepter des documents envoyés par d'autres machines (ordinateurs clients), les traiter, et les envoyer à l'imprimante qui convient.

## Historique

CUPS fut créé fin 1999 par Michael Sweet et Andrew Senft, propriétaires de Easy Software Products, et resta à l'état de prototype (alpha et bêta) durant deux ans avant la première version. Le premier axe de développement porta sur l'utilisation du LPD (Line Printer Daemon protocol). Cependant, à cause de l'incompatibilité de certaines marques, le protocole d'impression Internet (IPP) était fourni en plus comme une alternative plus efficace dans quelques cas. Après une période de concurrence directe avec le système LPRng (en), CUPS a émergé comme le système d'impression par défaut pour la plupart des distributions Linux. Il a, par exemple, été adopté à partir de la version 7.2 de Linux Mandrake (aujourd'hui Mandriva) sortie en 2000, et de la version 9 de Linux Red Hat sortie en 2003. Depuis mars 2002 il est utilisé comme le système d'impression par défaut sur Mac OS X après qu'Apple a renoncé à développer son propre système d'impression. En février 2007, Apple rachète CUPS et engage Michael Sweet pour continuer d'assurer sa maintenance. En 2020, l'organisation OpenPrinting a bifurqué le projet, avec Michael Sweet poursuivant le travail dessus.

## Vue d'ensemble

CUPS fournit un mécanisme qui permet aux applications d'imprimer de façon standardisée, c'est lui qui s'occupe de converser avec les imprimantes. Le système est organisé en trois couches :
* les applications envoient les documents à imprimer à un gestionnaire de tâche sur le serveur CUPS ;
* ce gestionnaire passe le document à travers un filtre pour le convertir dans un langage que l'imprimante peut comprendre ;
* le document ainsi transformé est livré à un module de transport qui se charge de transmettre les données d'impression à un périphérique local ou une connexion réseau.
Le système utilise de manière importante PostScript et la rastérisation des données pour convertir les données dans un format adapté à l'imprimante.
CUPS permet aux constructeurs d’imprimantes et aux développeurs de pilotes d’imprimantes de créer facilement des pilotes qui fonctionnent directement sur le serveur d’impression. Le processus se fait sur le serveur, ce qui permet de faciliter les impressions en réseau par rapport aux autres systèmes d’impression Unix. Quand elles sont utilisées avec Samba, les imprimantes peuvent être reliées par des ordinateurs à distance fonctionnant sous Windows et des pilotes génériques PostScript peuvent être utilisés pour imprimer à travers tout le réseau.
CUPS utilise comme base le protocole IPP d'impression internet (Internet Printing Protocol) pour gérer la liste des tâches d'impression. Il fournit également le traditionnel Système V et l'interface en ligne de commande Berkeley, avec un support limité pour le protocole SMB (Server Message Block). Les pilotes fournis par CUPS peuvent être configurés à l'aide de fichiers texte au format PPD (PostScript Printer Description d'Adobe). Il y a plusieurs interfaces utilisateur adaptées aux différentes plateformes qui permettent de configurer CUPS. Elles sont construites sur la base d'une interface web. CUPS est distribué sous la licence GNU GPL (General Public License) et GNU LGPL Version 2 (Lesser General Public License).

## Système de filtre

* CUPS gère l'envoi de différents types de données vers le serveur CUPS qui les convertit en un format que l'imprimante comprendra et sera capable d'imprimer.
* Un des principaux avantages de CUPS est qu'il peut interpréter une grande variété de formats de données pour le serveur d'impression. Il convertit les données à imprimer dans le langage/format final via une série de filtres. Il utilise pour cela les types MIME (Multipurpose Internet Mail Extensions). MIME est un standard internet pour le format des courriers électroniques mais il est communément utilisé dans d'autres systèmes pour déterminer le type de fichier que le système est en train de traiter.

## Le planificateur

Le planificateur de CUPS peut implémenter l'IPP (protocole d'impression Internet) ou LPD (protocole de démon d'impression en ligne). Il accepte les requêtes HTTP 1.1 et il fournit une interface web pour la gestion de la file d'attente, la configuration du serveur et sa documentation. Cette interface est accessible par défaut en tapant http://localhost:631/ dans un navigateur. Il reste nécessaire de connaître le mot de passe administrateur pour effectuer certaines opérations.
Un module d'autorisation contrôle quels messages IPP et HTTP peuvent passer à travers le système. Une fois que les paquets IPP/HTTP sont autorisés, ils sont envoyés au module client qui écoute et traite les connexions entrantes. Le module client est aussi responsable de l'exécution externe du programme CGI comme du support web des imprimantes, du contrôle et de l'administration. Une fois que ce module a traité ses requêtes, il les envoie vers les modules IPP qui valident l'URI afin d'empêcher un client de contourner l'identification du serveur HTTP. L'URI est une chaîne qui indique le nom ou l'adresse d'un élément du réseau physique ou logique.
Le planificateur autorise les classes d'imprimantes ; les applications peuvent envoyer des requêtes à des groupes d'imprimantes d'une classe, ce qui permet au planificateur de diriger le travail vers la première imprimante libre. Un module de travaux gère les travaux d'impression, il les envoie vers le filtre et vers le programme pour finaliser la conversion et l'impression, et pour contrôler le statut de ces processus.

## Base de données MIME (Multipurpose Internet Mail Extensions)

Après que la tâche d'impression a été assignée au planificateur, elle est passée au système de filtrage de CUPS. Ceci convertit les données dans un format exploitable par l'imprimante. Durant le démarrage, le démon CUPS charge deux bases de données MIME : mime.types qui définit les types de fichiers connus dont CUPS accepte les données, et mime.convs qui définit les programmes qui traitent chaque type MIME particulier.
Le fichier mime.types a la syntaxe suivante :
mimetype { [extension-fichier] | [chemin-associé] }
La deuxième ligne associe le contenu du fichier au type MIME spécifié en déterminant que le premier kilooctet du texte dans le fichier contient des caractères imprimables et que ceux-ci incluent des balises HTML.
Le fichier mime.convs a la syntaxe suivante :
source — destination — cost — program
Le champ « source » est le type MIME qui est déterminé au vu du fichier mime.types, pendant que le champ destination liste le type de sortie requise et détermine quel programme devrait être utilisé. Le champ « cost » donne une assistance dans la sélection de jeux de filtres quand on convertit un fichier. Le dernier champ, « program », détermine quel programme de filtre est utilisé pour réaliser les conversions de données.
Quelques exemples :
application/vnd.cups-postscript application/vnd.cups-raster 50 pstoraster

## Le processus de filtrage

Le processus de filtrage fonctionne en recevant des données pré-formatées avec six arguments :
* le nom de la file d’impression ou du filtre (d’impression) ;
* l’identifiant de la tâche demandant l’impression du document ;
* le nom d’utilisateur ;
* le nom du processus ;
* le nombre de copies à imprimer, des options d’impression ;
* le nom du fichier à imprimer (bien qu’il ne soit pas nécessaire s'il a été redirigé depuis l’entrée standard).
Il détermine ensuite le type des données qui ont été envoyées et le type de filtre associé grâce à la base de données MIME.
Ces données peuvent aussi être converties au format PostScript ou directement sous forme de trame. S'il est converti en PostScript, un filtre supplémentaire appelé pré-filtre est appliqué afin d’ajouter des options d’impression au PostScript original. Par exemple la sélection des pages à imprimer.
Après que le pré-filtrage a eu lieu, les données sont envoyées directement au programme CUPS (si on utilise une imprimante PostScript), elle passe par un autre filtre (comme Foomatic de linuxprinting.org), ou par Ghostscript qui transcrit le PostScript en trame CUPS qui est une sorte de format intermédiaire (le type MIME associé est application/vnd.cups-raster).
Le format intermédiaire de la trame est alors transmis à un filtre final qui convertit les données de la trame en une trame spécifique à l’imprimante. Les filtres par défaut qui sont inclus avec CUPS sont : trame vers PCL, trame vers ESP/P ou ESP/P2 (un langage d’impression EPSON, actuellement très utilisé par leur nouveau format ESC/P-Raster) et trame vers Dymo (un autre fabricant d’imprimante).
Cependant, il y a d’autres alternatives qui peuvent être utilisées avec CUPS. ESP, les créateurs de CUPS, ont réalisé leurs propres filtres CUPS ; Gimp-Print est une gamme de pilotes pour imprimantes de haute qualité (pour la plupart) pour les imprimantes à jet d’encre, et le Turbo-Print pour Linux a une autre gamme de pilotes de qualité pour une large gamme d’imprimantes.

## Red Hat Linux / Fedora

Au début, avec Red Hat Linux 9 un gestionnaire d'impression pré-installé basé sur CUPS et intégré dans GNOME était fourni. Cela permettait l’ajout d’imprimantes via une interface utilisateur similaire à celle de Microsoft, où une nouvelle imprimante pouvait être ajoutée en utilisant un assistant de configuration, avec lequel on pouvait changer les propriétés de l'imprimante par défaut dans une fenêtre contenant une liste d'imprimantes installées. Les processus d'impression pouvaient également être démarrés et stoppés en utilisant un gestionnaire d'imprimantes, et l'imprimante pouvait être mise en pause en utilisant un menu contextuel qui apparaît à l'écran après un clic droit sur l'icône de l'imprimante.
Ce système a été critiqué par Eric Raymond dans son œuvre The Luxury of Ignorance (Le luxe de l'ignorance). Raymond a essayé d'installer CUPS en utilisant le gestionnaire d'imprimantes de FedoraCore 1. Il ne l'a pas trouvé intuitif et a critiqué l'interface en se basant sur le fait que celle-ci ne prenait pas en compte le "point de vue de l'utilisateur". Il a trouvé que l'idée des listes d'imprimantes n'était pas claire car les utilisateurs créaient des listes en local sur leur ordinateur mais ces listes étaient en réalité créées sur le serveur CUPS.
Il a également trouvé la surabondance des choix de types de liste d'impression confuse du fait qu'il pouvait choisir les réseaux CUPS (IPP), Unix (LDP), Windows (SMB), Novell (NCP) ou JetDirect. Il a trouvé le(s) fichier(s) de configuration remarquablement inutile(s) et largement non-pertinent(s) pour répondre aux besoins de l'utilisateur. Raymond a utilisé CUPS en tant que thème général pour montrer que l'interface utilisateur des bureaux Linux avait besoin d'être repensée. Il a déclaré :
« Le gros problème ici, est que l'assistant de configuration effectue tous les processus approuvés (GUI, avec des boutons à cliquer standards, l'aide apparaissant dans un navigateur, etc., etc.) mais ne possède pas l'attribut central qu'ils sont supposés atteindre : l'accessibilité de la découverte. Ce qui fait la qualité d'une interface, c'est le fait qu'à chaque action soit associé un commentaire, depuis lequel vous pouvez apprendre que faire par la suite. Votre projet a-t-il cette qualité ? »

## Fonction KDEPrint : un module de configuration du serveur CUPS

KDEPrint, pour KDE, est une plateforme contenant divers outils graphiques qui fonctionne comme l'interface graphique de CUPS et permet l'administration des classes, des files et travaux d'impression. Depuis la version 2.2 de KDE un assistant d'impression est inclus pour aider notamment à l'ajout de nouvelles imprimantes.
KDEPrint supporte différentes plateformes d'impression parmi lesquelles CUPS est considérée comme l'une des meilleures. Cela a remplacé une version précédente de supports d'impression pour KDE, qtcups et est compatible avec ce module de KDE. Kprinter, une boîte de dialogue, est maintenant l'outil principal pour envoyer des travaux au matériel d'impression ; il peut aussi être lancé par ligne de commande. KDEPrint inclut aussi un système qui va pré-filtrer chaque travail avant de l'envoyer à CUPS, ou pour s'occuper lui-même des travaux (comme convertir un fichier en PDF) ; ces filtres sont décrits par une paire de fichier XML.
Les composants principaux de KDEPrint sont une fenêtre de dialogue pour l'impression, qui permet la modification des propriétés d'impression, un gestionnaire d'impression qui permet la gestion du parc d'imprimantes (ajout et suppression d'imprimantes), un assistant d'ajout d'imprimantes et un outil de visualisation et de gestion des travaux qui gèreront les travaux d'impression (comme pause/reprendre, annuler, transférer vers une autre imprimante). Il y a aussi un module de configuration CUPS qui est intégré à KDE.
Avant sa version 2.2, KDE utilisait Kups, une interface graphique pour CUPS qui permettait l'administration des classes, file d'attente et travaux d'impression et avait un assistant d'ajout de nouvelle imprimante.
Le CUPS de Mandrake Linux peut être géré dans le centre de contrôle de Mandrake. Élargir le CUPS peut aussi être géré de là.
Dans la version 10.1 de Mandrake Linux, une interface graphique pour gérer l'impression a été créée. Elle permet aux utilisateurs d'ajouter, enlever et mettre à jour les imprimantes, aussi bien que le contrôle des travaux d'impression. Ceci est fait à partir d'un programme centralisé de configuration qui tient compte de la configuration du serveur CUPS dans un ensemble centralisé d'écrans.