本附录包括在 Oracle Solaris OS 中使用 Internet 打印协议 (Internet Printing Protocol, IPP) 的信息。IPP 可以为 CUPS 和 Windows 客户机提供互操作性。在 Oracle Solaris OS 中,IPP 的 PAPI 实现提供了服务器端和客户端打印支持。
本附录包括以下信息:
有关开放打印的更多信息,请访问 http://sf.net/projects/openprinting。
IPP 是应用程序级别的网络打印协议,可用于通过 Internet 工具和技术进行分布式打印。通过采纳该协议,可以为从 Internet 打印文档提供通用的解决方案。一些系统和打印机供应商之所以使用 IPP,是因为该协议包括发出多种标准请求和从打印客户机系统接收标准响应所必需的工具。IPP 提供了版本控制、可扩展性和安全性以及一些增强功能(包括在作业和打印机状态检索方面进行的改进)。
Oracle Solaris 发行版中的 IPP 支持包含客户端支持和服务器端支持。客户端支持和服务器端支持共享一些通用元素,以及客户机或服务器操作所特有的一些元素。IPP 客户机支持和服务器支持共享用于实现其中某些通用组件的基本代码。从 Solaris 10 3/05 发行版开始,提供了 IPP 的服务器端支持。Solaris 10 5/08 发行版中引入了客户端支持。
通过 IPP,可以执行下列任务:
了解有关打印机的功能
将打印作业提交到打印机
确定打印机或打印作业的状态
取消以前提交的打印作业
存放、释放和重新启动打印作业
修改打印作业
在队列之间移动打印作业
接受、拒绝、启用和禁用打印队列
修改和删除打印机
IPP 包括一个简化的打印模型,简要说明实际打印解决方案的不同侧面。此模型使用对象、属性和针对这些对象执行的一组操作。IPP 使用这些简要说明,以详细、标准、可扩展和安全等方式在打印服务使用者或客户与打印服务提供者之间传达信息。
IPP 侦听服务(也称为侦听程序)提供了一种 IPP 网络协议服务,该服务为打印客户机系统提供一种与运行侦听程序的系统上的打印服务进行交互的方法。此侦听程序实现了服务器端 IPP 支持,其中包括一组标准操作和属性。此侦听程序是在 Oracle Solaris 中作为 Apache 模块和一系列共享库(包含 IPP 操作和网络支持)实现的。在系统上安装 Oracle Solaris OS 时,将会安装 IPP 软件栈。IPP 侦听服务是一个 SMF 服务,它依赖于要运行的打印服务。因此,在添加第一个打印队列后,会在打印服务器上自动启用 IPP。同时,在删除最后一个打印队列后,也会禁用该服务。
在前端,IPP 服务器支持被放在 HTTP 版本 1.1 的上面一层。服务器通过 HTTP POST 请求接收 IPP 操作。然后,服务器执行所请求的操作,并通过 HTTP 将响应发回到客户机。这些操作包括但不限于提交和取消打印作业,以及查询打印机和已排入打印机队列的某个或全部打印作业的属性。在后端,IPP 侦听程序通过与打印假脱机程序进行通信来执行操作。在 Oracle Solaris OS 中,此假脱机程序当前是 lpsched 守护进程。
IPP 侦听服务实现(服务器端支持)嵌入在 Apache Web 服务器下方。Web 服务器通过 HTTP POST 请求接收 IPP 操作。接收到 HTTP POST 请求后,会将其传递到 Apache IPP 模块 (mod_ipp.so)。根据配置情况,Apache Web 服务还可以提供一种验证服务,并用于在打印客户机与服务器之间进行加密。侦听服务作为其自己的专用 Apache 实例来运行。
此过程如下所示:
将 IPP 请求从客户机发送到服务器。
Apache Web 服务器接受此连接。
Apache Web 服务器随后将连接传递到 mod_ipp。
mod_ipp 将连接和配置数据传递到 libipp-listener。
libipp-listener 使用 lipipp-core 读取请求。
libipp-listener 将请求分发到位于 lipipp-listener 中的操作处理程序。
操作处理程序将请求转换为 PAPI 调用,然后进行该调用。
通过使用 psm-lpsched,将 PAPI 调用转换为特定于打印服务的请求。
打印服务响应该请求。
psm-lpsched 命令将响应转换为 PAPI 结果。
libpapi 操作返回到 libipp-listener 操作处理程序。
libipp-listener 操作处理程序将结果传递给分发程序。
libipp-listener 分发程序使用 libipp-core 库将结果写入到客户机。
分发程序返回 mod_ipp 入口点。
下表介绍了 Oracle Solaris OS 中构成 IPP 支持的组件:
表 A–1 IPP 组件
组件 |
功能 |
---|---|
httpd |
Apache Web 服务器。它提供了一个 HTTP 传输侦听程序,用于在 IANA 注册 IPP 端口 tcp/631 上侦听 HTTP 请求。一旦收到请求,会将请求传递到 IPP Apache 模块。 |
mod_ipp.so |
Apache IPP 模块。此 Apache 模块检查客户机的 HTTP 请求,以确定它是否类似于 IPP 请求(application/ipp 的 mime-type 和 HTTP POST 操作)。一旦确定它是 IPP 请求,则会将其传递到 IPP 侦听程序库。此模块还引入和处理了特定于 IPP 的 Apache 配置指令。 |
libipp-listener.so |
IPP 侦听程序库。此库利用核心 IPP 编组库来解码 IPP 请求,并将其分发给它的一个 IPP 操作实现函数。这些函数将 IPP 请求转换为 PAPI 调用,以便与本地打印服务进行交互。进行处理后,侦听程序库对请求进行编码,并将结果发回到发出请求的客户机。 |
libipp-core.so |
IPP 编组库对 IPP 字节流进行解码和编码,以通过线路进行接收和传输。 |
libpapi.so |
PAPI 库为应用程序(如 IPP 侦听服务)提供了一种与打印服务进行交互的方法。 |
IPP 侦听服务库 (libipp-listener)-是进行大部分协议请求处理的位置。该库使用核心 IPP 库 libipp-core.so 读取和验证请求。在验证请求后,会将请求转换为一系列客户机 API 调用。然后,使用核心 IPP 库将这些调用的结果转换为相应的 IPP 响应。Web 服务器会将响应返回到客户机系统。侦听服务库的接口是一个特定于 IPP 服务器端实现的项目专用接口。
IPP 核心库 (libipp-core.so)-在客户机操作与服务器操作之间共享。IPP 核心库包含一些用于读取和写入协议请求和响应的例程。该库将在标准二进制表示形式和一组通用数据结构之间转换 IPP 请求和响应数据。从根本上讲,这种通用数据表示形式用于将请求转换为打印服务中立的表示形式,或者从打印服务中立的表示形式进行转换,并通过通用打印接口 libpapi.so 传递这种通用数据表示形式。由于客户端和服务器端 IPP 支持都必须执行此功能,因此,客户机和服务器共享此 IPP 核心库。
PAPI 库 (libpapi.so)-为应用程序提供了一种打印服务中立的方法,来与打印服务或协议进行交互。在本例中,PAPI 库为 Apache IPP 侦听服务提供一种与本地 LP 服务进行交互的方法。PAPI 库根据 printers.conf 配置数据库中存储的客户端队列配置数据,确定要与之交互的打印服务。
以下各节介绍了 IPP 支持模型的各个方面。
IPP 包含两种基本对象类型: 打印机和作业。每种对象类型都包含实际打印机或实际打印作业的特征。每种对象类型都被定义为这种特定对象类型可支持的一组可能属性。
为了明确引用所有打印机和作业对象,所有这些对象都用统一资源标识符 (Uniform Resource Identifier, URI) 加以标识。URI 概念以及作为标识符的实现方式非常有用,因为它所提供的手段既能够唯一标识与打印服务 (IPP) 进行通信的方法,又能够唯一标识打印机队列 (//server/printers/queue) 或作业的不同网络标识符。
创建打印请求时,生成的 IPP 协议消息必须包含将对其执行操作的打印机对象的 printer-uri。可以从打印机对象或命名服务 printer-uri-supported 属性检索 printer-uri 的可能值。
打印机对象是 IPP 模型中的主要对象。打印机对象可为 IPP 提供服务器端支持。打印机对象包含的功能通常与物理输出设备相关联。这些功能包括假脱机、调度、变换和管理多个与打印服务器关联的设备。打印机对象用 printer-uri 唯一地标识。为了搜索和查找有关打印机对象的静态信息(如名称、上下文和打印机功能),可以将这些打印机对象注册为目录条目。动态信息(例如打印机的排队作业数目、错误和警告)与打印机对象本身相关联。
只要语义与打印机对象的语义一致,就可以使用打印机对象来表示实际设备或虚拟设备。
IPP 客户机在客户端实现协议,以便为您或代表您运行的程序提供查询打印机对象的能力,目的是为了提交和管理打印作业。IPP 服务器是打印机对象的一部分,用于实现打印服务的应用程序语义。打印机对象可以嵌入输出设备中,也可以在与输出设备进行通信的网络主机上实现。
将作业提交到打印机对象时,打印机对象将验证请求中的属性,然后创建作业对象。当您查询作业状态或监视其进度时,就在与作业对象进行交互。如果您取消打印作业,则使用的是作业对象的 Cancel-job 操作。有关作业对象操作的更多信息,请参见IPP 操作关键字。
作业对象用于为打印作业建模。作业对象包含文档。如果您通过 IPP 客户机将打印请求发送给打印机对象,则创建作业对象所需的信息将以创建请求的形式发送到打印服务器。打印机对象将验证创建请求,如果接受,打印机对象随后将创建新的作业对象。IPP 作业对象用 printer-uri 和 job-id 属性或 job-uri 属性的组合唯一地标识。有关更多详细信息,请参见IPP 操作关键字。
IPP 侦听服务提供了一个 IPP 网络协议服务,该服务为打印客户机系统提供一种与运行侦听程序的系统上的打印服务进行交互的方法。此侦听程序实现了服务器端 IPP 协议支持,其中包括一组广泛的标准操作和属性。此侦听程序是在 Oracle Solaris OS 中作为 Apache 模块和一系列共享库(包含 IPP 操作和网络支持)实现的。在系统上安装 Oracle Solaris OS 时,将会安装 IPP 软件栈。IPP 侦听服务是一个 SMF 服务,它依赖于要运行的打印服务。因此,在添加第一个打印队列后,会在打印服务器上自动启用 IPP。在删除最后一个打印队列后,会禁用 IPP。
IPP 的服务器端支持从 IPP 模块 mod_ipp 开始。侦听服务使用 Apache Web 服务器,这是因为 Oracle Solaris OS 附带提供 Apache 软件。Apache 模块使用动态共享对象 (Dynamic Shared Object, DSO) 接口以插入到 Web 服务器下面。通过使用 DSO 接口,此模块包含对 IPP 侦听服务的配置支持,并包含 Web 服务器入口点以便为侦听程序提供 HTTP 连接。通过这种模块化方法,IPP 支持可以重用 Apache 提供的加密和验证机制。
IPP 侦听服务配置文件 /etc/apache/httpd-standalone-ipp.conf 与任何标准的 Apache 1.3 配置文件类似。这些配置文件可采用您要使用的任何 Apache 1.3 配置指令。
缺省配置包括以下功能:
在端口 631 上侦听。
装入最小的一组 Apache 模块。
在 /printers/path (ipp://server/printers/) 下启用所有支持的 IPP 操作,而无需进行验证。
为 /printers/ 启用的缺省操作仅限于一组具有较小安全风险的操作。但是,所有操作都在 /admin/path (ipp://server/admin/) 下启用,并且需要进行基本验证。
下表说明了可以选择的 mod_ipp Apache 配置选项。
表 A–2 mod_ipp Apache 模块配置选项
值 |
说明 |
---|---|
ipp-conformance |
选择协议检查级别。缺省值为 automatic,它提供最大限度的客户机交互。 |
ipp-operation |
使您可以为多个 IPP 操作有选择性地启用或禁用 IPP 操作支持。 |
ipp-default-user |
选择与本地打印服务联系时使用的用户名。缺省为 lp 打印用户,它可启用功能更强的代理。 |
ip-default-service |
选择将请求定向到的缺省打印服务。缺省为 lpsched 守护进程,当前仅针对 lpsched 进行了测试。 |
下表说明了 Apache Web 服务器配置的一致性检查类型。使用的语法为:
ipp-conformance value |
值 |
含义 |
Automatic |
仅检查协议侦听程序是否支持所请求的操作。(缺省) |
1.0 |
检查请求是否符合 IPP/1.0 规范。 |
1.1 |
检查请求是否符合 IPP/1.1 规范。 |
以下是包含注释的 Apache 配置文件示例:
if mod_ipp is loaded User lp run as "lp" URI: ipp://{host]/printers/{queue} SetHandler application/ipp use mod_ipp for this location ipp-conformance strict enable strict protocol checking (default) ipp-operation all enable enable all supported operations
IPP 对象支持操作。操作由请求和响应组成。当打印客户机与 IPP 对象进行通信时,该客户机会向该对象的 URI 发出操作请求。操作请求和响应具有标识操作的参数。操作还具有影响操作的运行时间特征的属性。这些特定于操作的属性被定义为操作属性。打印请求包含操作属性、对象属性和执行特定操作所需的文档数据。每个请求都要求获得来自对象的响应。每个响应都以对应的状态代码作为响应参数来指示操作的成败。响应包含操作属性、对象属性,以及在执行操作请求期间生成的状态消息。
下表说明了 Apache Web 服务器配置的 IPP 操作关键字。
表 A–4 IPP 操作关键字
值 |
含义 |
All |
此关键字用于代替某个操作。此关键字用于表示已选择 mod_ipp 支持的所有操作。 |
Required |
此关键字用于代替某个操作。此关键字用于表示已选择 RFC-2911 中定义的所有必需操作,其中包括以下操作: print-job、cancel-job、get-job-attributes、get-jobs 和 get-printer-attributes。 |
Print-job |
客户机要提交一个仅包含单个文档的打印作业。文档数据将随请求一起发送。 |
Print-uri |
不受支持。 |
Validate-job |
在提交打印作业之前,客户机要验证调度程序能否处理打印作业。 |
Create-job |
客户机要提交一个包含多个文档的打印作业。文档是使用 send-document 和 send-uri 操作发送的。 |
Send-document |
客户机要将文档添加到使用 print-job 操作创建的打印作业中。文档数据将随请求一起发送。 |
Send-uri |
不受支持。 |
Cancel-job |
客户机要取消打印作业。 |
Get-job-attributes |
客户机要收集有关打印作业的信息。 |
Get-jobs |
客户机要收集特定打印队列中打印作业的列表。 |
Get-printer-attributes |
客户机要收集有关特定打印队列的信息。 |
Hold-job |
客户机要保留特定打印作业。 |
Release-job |
客户机要释放特定打印作业。 |
Restart-job |
客户机要重新启动特定打印作业。 |
Pause-printer |
客户机要暂停(禁用)特定打印队列。此操作将停止处理队列中的打印请求。请注意,此操作不会禁止队列接受作业。 |
Resume-printer |
客户机要恢复(启用)处理特定打印队列中的作业。 |
Purge-jobs |
客户机要删除特定打印队列中的所有作业。 |
Set-printer-attributes |
创建或修改打印机属性。 |
Set-job-attributes |
修改现有打印作业的属性。 |
Enable-printer |
恢复(接受)将打印作业排入队列。 |
Disable-printer |
禁止(拒绝)将打印作业排入队列。 |
cups-get-default |
检索打印服务的缺省目标。 |
cups-get-printers |
枚举通过打印服务提供的所有打印机。 |
cups-get-classes |
枚举通过打印服务提供的所有类。 |
cups-accept-jobs |
特定于 CUPS 的 Enable-printer 等效项。 |
cups-reject-jobs |
特定于 CUPS 的 Disable-printer 等效项。 |
cups-move-jobs |
在相同打印服务的队列之间移动作业。 |
Oracle Solaris 中的 IPP 客户端支持是在 PAPI 下面实现的。借助于此支持,使用 PAPI 的任何应用程序都可以使用 IPP 以及其他打印服务和协议。
这些应用程序包括:
GNOME 桌面环境-使用 libgnomeprint 的应用程序
BSD 命令-BSD UNIX LPD 打印服务命令:
lpr
lpq
lprm
lpc
LP 命令-System V UNIX LP 打印服务命令:
lp
lpstat
lpmove
accept
reject
enable
disable
应用程序的 IPP 客户端支持是通过可装入的模块 psm-ipp.so 提供的,该模块将根据打印机 printer-uri 或正在处理的作业在运行时装入。
由于 IPP 在 HTTP 传输的上面一层,因此,客户端和服务器端支持都需要具有读取和写入 HTTP 协议的功能。在服务器端,此支持是由 Apache Web 服务器提供的。在客户端,此支持是由 HTTP 库 libhttp-core.so 提供的。
psm-lpsched 命令提供打印服务中立的 PAPI 表示形式与 LP 打印假脱机程序 (lpsched) 之间的转换。此命令提取传递到各种 PAPI 函数中的 PAPI 属性,并将这些属性转换为数据的内部 lpsched 表示形式。然后,psm-lpsched 联系 lpsched 以执行请求的操作。执行后,psm-lpsched 将结果转换回打印服务中立的 PAPI 表示形式,并将这些结果返回给调用方。
LP 打印假脱机程序 (lpsched) 提供假脱机服务、将作业数据转换为打印机支持的格式以及将作业数据传输到物理打印机。
对于每个对象实例,都有一组支持的属性和值来描述该对象的特定实现。
对象的属性和值包括有关该对象的以下信息:
状态
能力
功能
作业处理功能
缺省行为
缺省特征
用于定义对象的每个属性都包括在一组属性中。特定对象的这组属性包括该对象可能支持的所有属性。对于标记为 REQUIRED 的属性,每个对象必须支持该属性。如果属性被标记为 OPTIONAL,则每个对象可以支持该属性。
打印机属性被分为两组:
这些属性描述受支持的作业处理能力以及打印机对象缺省值。
这些属性包括标识、状态、位置以及对有关打印机对象的其他信息源的引用。
支持打印机对象的配置示例包括以下各项:
不具备假脱机能力的输出设备
具备内置假脱机程序的输出设备
支持 IPP 的打印服务器,以及一个或多个适用以下条件的关联输出设备:
可能能够处理假脱机作业,或不能处理假脱机作业
可能支持 IPP,或无法支持 IPP
作业对象的特征也由其属性加以描述。
作业属性被分为两组:
请注意,打印客户机提供其中一些属性,而打印机对象生成其他属性。有一种实现方式可支持每作业对象多个文档,但是它必须至少支持每作业对象一个文档。
在 IPP 版本 1.0 和版本 1.1 中,文档不作为 IPP 对象进行建模。因此,文档没有对象标识符或关联的属性。所有的作业处理指令都作为作业对象属性进行建模。这些属性称为作业模板属性。这些属性同等地应用到作业对象中的所有文档。
IPP 对象具备的关系是随同对象属性的永久性存储永久保持的。
有关与任务相关的信息,请参见配置 Internet 打印协议。