Common Unix Printing System
Common Unix Printing System（コモン・ユニックス・プリンティング・システム）はUnix系オペレーティングシステム (OS) 用のモジュール化された印刷システムである。普通CUPS（カップス）と略称される。CUPSは、Mac OSやWindowsの印刷機構に遅れをとっていたUnix系OSに強力な印刷機能をもたらすことになった。CUPSではUnix系OSでプリンタの形式・型ごとに独自に書き上げねばならなかったデバイスドライバの作成が極めて容易になり、過去にUnix系OSが対応していた特殊なラインプリンタとPostScriptプリンタのみならず、Macintosh/Windows向けに市販されているプリンタのほぼ全てがUnix系OS上から利用できるようになるとされている。
CUPSを運用しているコンピュータは、クライアントのコンピュータから印刷ジョブを受け取るサーバとなり、それらのジョブを処理して適切なプリンタへと送る。また、その際にはHTTPのBasic認証およびDigest認証、ローカル認証、128ビットTLS/SSL暗号化などを用いることもできる。
CUPSはUnixの印刷スプーラとスケジューラ、フィルタ・システム、およびバックエンド・システムからなる。このうち、フィルタ・システムは印刷データをプリンタが理解可能な形式へ変換することを受け持ち、バックエンド・システムはそのデータをプリンタへと送ることを受け持つ。CUPSは印刷ジョブとキューを取り扱う基盤としてIPP (Internet Printing Protocol) を用いている。またCUPSはUnixで伝統的なSystem V形式とBSD（バークレー）形式のコマンド・ラインのインターフェースもサポートしており、さらにSMBプロトコルも部分的にサポートしている。CUPSが提供するデバイス・ドライバは、アドビのPPD (PostScript Printer Description) 形式のテキスト・ファイルを用いて設定が可能である。CUPSを設定するためCUPS自身はウェブ (HTTP) を用いた組込みのインターフェースを有している。また多くのユーザ・インターフェースがさまざまなプラットフォームに対して用意されており、ESP Print Proといった商用パッケージだけでなく、KUPS、GtkLP、QtKUPS、XPPなどのオープンソースライセンスで開発されているGUIがいくつも存在する。CUPSはApache Licenseの元で配布されている。以前はGNU General Public LicenseとGNU Lesser General Public License, Version 2で配布されていた。
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はcodice_1とcodice_2の2つのMIMEデータのファイルを使用する。codice_1はCUPSがファイルのMIME型を決定するために用いられ、codice_2はあるMIME型を別のMIME型に処理するためのプログラムを定義している。
例えば、HTMLファイルを検出するためのcodice_1の行は、
となっている。これは、ファイルのサフィックス（拡張子）がcodice_6もしくはcodice_7であるか、ファイルのテキストの始めの1KiBが印刷可能な文字からなっていて、かつcodice_8かcodice_9から始まっているなら、ファイルはMIME型text/htmlであるものと見なされることを意味している。一方、codice_2ファイルは以下のような行からなっている。
1番目のカラムと2番目のカラムはともにMIME型であり、それぞれ変換前のMIME型と変換後のMIME型とを表している。3番目のカラムはファイルを変換するために支払うべき「コスト」を表し、フィルタ・システムがファイルを変換するときに別々のフィルタの組合せの中からどれを選ぶかを決定するための評価基準とされる。最後のカラムはデータを変換するためのフィルタ・プログラムを表す。よって、codice_11型のファイルはフィルタcodice_12によってコスト50でcodice_13型に変換できることになる。
フィルタ・システムは、プリンタ・キューまたは印刷フィルタの名前、印刷ジョブのジョブ番号、ユーザ名、ジョブ名、印刷部数、その他印刷のオプション、ファイル名（標準入力からリダイレクトされた場合は不要）の引数とともに入力データを受け取る。その後、上述のようにMIMEデータベースを用いて入力データの型と使用されるフィルタを決定する。例えば、画像データが検出されればそれ用の特定のフィルタで処理され、HTMLのデータならまた別の特定のフィルタで処理される。これらのデータはその後PostScriptデータに変換されるか、直接ラスタ・データに変換しうる。PostScriptデータへ変換された場合には、"プレフィルタ"と呼ばれるさらなるフィルタが適用され、これは印刷するページ範囲の指定や、複数のページを1ページに埋め込むN-Upモードの設定などプリンタに特定のオプションを加えることができるようにPostScriptデータにたいして別のPostScript変換プログラムを適用する。
プレフィルタによる処理が終わると、PostScriptプリンタを用いている場合にはそのままデータはCUPSのバックエンドに送られ、そうでない場合には（linuxprinting.orgのFoomaticのような）別のフィルタかGhostscriptで処理される。これはPostScriptをプリンタに依存しない中間形式の"CUPS-raster"フォーマット (MIME 型 codice_14) へと変換する。最後にこの中間ラスタ形式はプリンタ個別の形式へと最終フィルタで処理される。
このラスタ形式からのフィルタとして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の印刷システムに対応するcodice_15コマンドとBSDの印刷システムに対応するcodice_16コマンドとが互換プログラムとしてインストールされる。これらはCUPSへの標準的なインターフェースとなり、これらの印刷システムに依存する現存するアプリケーションとの最大限の互換性を保つ。