Common Unix Printing System

歴史

CUPSはまず、Easy Software Productsのマイケル・スイートとアンドルー・ゼンフトによって1999年の秋に作成された。最初のリリース・バージョンが公開されるまでのアルファとベータ・バージョンに2年間を要している。初期にはlpd (line printer daemon) を用いるよう開発努力が傾けられたが、ときとしてプリンタとの相性が悪いためにIPPも代替としてサポートされた。CUPSはすぐさま、Red Hat LinuxなどいくつかのLinuxディストリビューションで標準の印刷システムとして採用された。アップルコンピュータはMac OS Xのデフォルトの印刷システムとして2002年3月にCUPSを採用している。2007年2月にアップル社は主たる開発者であるマイケル・スイートを雇用し、CUPSのソース・コードを取得している。

概要

CUPSは、標準的な方法で印刷ジョブをプリンタに送ることを可能とする機構を与えるものである。印刷データはまずスケジューラへと送られ、スケジューラはジョブをプリンタが理解できる形式へと変換するためフィルタ・システムに送る。さらにフィルタ・システムはデータを、デバイスやネットワークへと送るための特殊なフィルタであるバックエンドへと受け渡す。CUPSのシステムはデータをプリンタが理解できる言葉へと変換するのにPostScriptとラスタ・グラフィックスをフルに活用している。
CUPSの最大の利点は、それが、印刷サーバ上で様々なデータ様式を処理できる標準的でモジュール化された印刷システムであることである。CUPS以前には、それぞれ独自の言語と形式を用いていた様々な市場のプリンタに対応している標準的なプリンタの処理システムは見当たらなかった。例えば、System Vとバークレイの印刷システムは互いの互換性がほとんどなく、しかもプログラムのデータ形式からプリンタが理解できる形式へと変換するための複雑なスクリプトと急場しのぎの手段とを用意する必要があった。さらにこれらはしばしばプリンタへと送られているファイル形式を検出する手段を持たないために、データ列を正しく自動的に変換することができなかった。また中心となるサーバ上ではなく各ワークステーション上でデータの変換を行っていた。
CUPSでは、プリンタのメーカーやドライバの開発者が印刷用サーバで専用に動くドライバを製作することが以前よりもはるかに容易なものとなっている。また、サーバ上で処理が成されることによって、他のUnixの印刷システムで行われていたことと較べネットワークを介する印刷も非常に容易なものとなる。ひとつの利点はSambaを用いるときで、プリンタはリモートのWindowsコンピュータで用いられ、しかも一般的なPostScriptドライバをネットワークを介する印刷に用いることができる。

スケジューラ

CUPSスケジューラはIPP (Internet Printing Protocol) もしくはlpd (line printer daemon) プロトコルのどちらかを用いることができる。スケジューラはHTTP/1.1のリクエストを解釈し印刷ジョブの管理、サーバの設定、およびCUPS自体の説明資料のためにウェブを用いたインターフェースを提供している。
スケジューラは、IPPとHTTPのどのメッセージがシステムに受け渡せるかを制御するための承認モジュールを有している。IPP/HTTPパケットは一旦承認されると、やって来る接続を監視しそれを処理しているクライアント・モジュールに送られる。クライアント・モジュールはまた、必要に応じてウェブ基盤のプリンタ、「クラス」、ジョブの実行状況のモニタと管理をサポートするための外部CGIプログラムの実行を受け持っている。クライアント・モジュールがリクエストを処理すると、次にデータはさらなる処理のためにIPPモジュールへと送られる。このモジュールは、クライアントがHTTPサーバ上のアクセス制限または認証を回避することを防ぐためにURI (Uniform Resource Identifier) の検証を行う。
スケジューラではプリンタがクラスを持つことを認めている。これは複数のプリンタをグループ化するひとつの方法であり、ジョブをあるクラスへと送るような用い方を可能としている。すなわち、スケジューラはクラス内で最初に利用できるプリンタを選び出してジョブをそのプリンタへと送る。ジョブ・モジュールは、最終的な変換と印刷のために印刷ジョブをフィルターやバックエンドの処理へと送ることで印刷ジョブを管理する。またそれらフィルターやバックエンドからのステータス・メッセージも監視している。
スケジューラのコンフィギュレーション・モジュールはCUPSのデータ構造を初期化するとともに設定ファイルを解析し、CUPSプログラムをスタートさせる。コンフィギュレーション・モジュールは設定ファイルを処理している間はCUPSサービスを停止させ、処理が完了するとサービスを再開させる。
ログ・モジュールはアクセス、エラー、ログ・ファイル操作のスケジューラの事象のログを取り扱い、一方メイン・モジュールはタイムアウトとクライアントからの接続に対するI/Oリクエストの送出を受け持ち、またシグナルを監視し、必要に応じサーバの設定ファイルの再読み込み、さらに子プロセスのエラーと終了を取り扱う。
スケジューラで用いられているその他のモジュールには、印刷デバイスが理解できる形式に印刷データを変換するときのフィルター処理に用いられるMIME型と変換データベースを取り扱うMIMEモジュール、PPD (Postscript Printer Description) ファイルのリストを扱うPPDモジュール、システムで利用可能なデバイスのリストを扱うデバイス・モジュール、CUPS内のプリンタとPPDを扱うプリンタ・モジュールがある。

フィルタ・システム

CUPSの大きな利点のひとつは、様々なデータ形式を印刷サーバ上で処理できるということである。印刷ジョブは一連のフィルターを介してプリンタの最終的な言語・形式へと変換される。このデータ形式と変換方法はMIME型を利用して抽象化されている。CUPSはmime.typesとmime.convsの2つのMIMEデータのファイルを使用する。mime.typesはCUPSがファイルのMIME型を決定するために用いられ、mime.convsはあるMIME型を別のMIME型に処理するためのプログラムを定義している。
例えば、HTMLファイルを検出するためのmime.typesの行は、
text/html       html htm \
      printable(0,1024) + (string(0,"<HTML>") string(0,"<!DOCTYPE"))
となっている。これは、ファイルのサフィックス（拡張子）がhtmlもしくはhtmであるか、ファイルのテキストの始めの1KiBが印刷可能な文字からなっていて、かつ<HTML>か<!DOCTYPEから始まっているなら、ファイルはMIME型text/htmlであるものと見なされることを意味している。一方、mime.convsファイルは以下のような行からなっている。
text/plain application/postscript 50 texttops
1番目のカラムと2番目のカラムはともにMIME型であり、それぞれ変換前のMIME型と変換後のMIME型とを表している。3番目のカラムはファイルを変換するために支払うべき「コスト」を表し、フィルタ・システムがファイルを変換するときに別々のフィルタの組合せの中からどれを選ぶかを決定するための評価基準とされる。最後のカラムはデータを変換するためのフィルタ・プログラムを表す。よって、text/plain型のファイルはフィルタtexttopsによってコスト50でapplication/postscript型に変換できることになる。
フィルタ・システムは、プリンタ・キューまたは印刷フィルタの名前、印刷ジョブのジョブ番号、ユーザ名、ジョブ名、印刷部数、その他印刷のオプション、ファイル名（標準入力からリダイレクトされた場合は不要）の引数とともに入力データを受け取る。その後、上述のようにMIMEデータベースを用いて入力データの型と使用されるフィルタを決定する。例えば、画像データが検出されればそれ用の特定のフィルタで処理され、HTMLのデータならまた別の特定のフィルタで処理される。これらのデータはその後PostScriptデータに変換されるか、直接ラスタ・データに変換しうる。PostScriptデータへ変換された場合には、プレフィルタと呼ばれるさらなるフィルタが適用され、これは印刷するページ範囲の指定や、複数のページを1ページに埋め込むN-Upモードの設定などプリンタに特定のオプションを加えることができるようにPostScriptデータにたいして別のPostScript変換プログラムを適用する。
プレフィルタによる処理が終わると、PostScriptプリンタを用いている場合にはそのままデータはCUPSのバックエンドに送られ、そうでない場合には（linuxprinting.orgのFoomaticのような）別のフィルタかGhostscriptで処理される。これはPostScriptをプリンタに依存しない中間形式のCUPS-rasterフォーマット (MIME 型 application/vnd.cups-raster) へと変換する。最後にこの中間ラスタ形式はプリンタ個別の形式へと最終フィルタで処理される。
このラスタ形式からのフィルタとしてCUPSにデフォルトで含まれているものは、PCL (Printer Command Language)、ESC/PまたはESC/P2、およびDymoへのフィルタである。ただし、CUPSで用いることができるいくつかの代替フィルタもある。CUPSの開発元であるEasy Software Productsは独自のCUPSフィルタをリリースしている。Gimp-Printは幅広い範囲の（主として）インクジェット・プリンタに対する高精度なドライバであり、LinuxのTurbo-Printはやはり様々な種類のプリンタに対しての種々のドライバを有している。

バックエンド

バックエンドはデータをプリンタに送る手段である。CUPSで有効なバックエンドには、パラレルポート、シリアルポート、およびUSBポートのプリンタとともに、IPP (Internet Printing Protocol)、JetDirect (AppSocket)、lpd (line printer daemon)、SMB (Server Message Block) プロトコルを介して処理されるネットワーク・バックエンドがある。

互換性

伝統的な印刷コマンドがCUPSでも用いることができるようにCUPSはSystem V形式とBSD形式の両方の印刷コマンドを与えている。CUPSは伝統的なlpdポートであるポート515を監視し、それを「バックエンド」として取り扱う。CUPSをインストールすると、System Vの印刷システムに対応するlpコマンドとBSDの印刷システムに対応するlprコマンドとが互換プログラムとしてインストールされる。これらはCUPSへの標準的なインターフェースとなり、これらの印刷システムに依存する現存するアプリケーションとの最大限の互換性を保つ。