Hi Cindy,
Find some comments on this in-line below. They are all fairly minor, or
nit-picking, so feel free to ignore them if you want to. See below ...
Cynthia Eastham wrote:
>
> I'd like to announce a new, much needed, printing project: PPD Cache
> Management. I am attaching a draft of the design document for your
> review. This is a small project which we hope to complete within the
> next month. In a nutshell, this will allow a PPD file to be added to
> the system, and the new printer information reflected in the cache file
> used by the printmgr to display available printer information the user.
>
> Thank you,
> Cindy
>
>
> ------------------------------------------------------------------------
>
> PPD Cache Manager Project Design
>
> BACKGROUND
> In order to provide support for a wide range of printers, the Solaris Print
> System has the ability to use Postscript Printer Description (PPD) files which
> can be used as a per queue configuration option. A set of gzipped PPD files
> is
> delivered with Solaris in the "system" directory under the PPD repository
> (/usr/lib/lp/model/ppd), as well a private cache
> (/usr/lib/lp/model/ppd/ppdcache) file of the printer information contained
> in each of the delivered PPD files.
>
> On the command line, a user can add, or modify, a print queue to use a PPD
> file
> using the lpadmin -n option. An unzipped copy of this PPD file is saved
> under /etc/lp/ppd and the original path of the PPD file is placed in the
> printer configuration file (/etc/lp/printers/<printer>/configuration). The
> lpadmin -n option allows users to specify PPD files not delivered with
> Solaris,
> just so long as the PPD file path is valid and the path ends with either a
> ".ppd" or ".ppd.gz" extension.
>
> With the Solaris Print Manager (printmgr) GUI, a graphical tool for managing
> printers under Solaris, printer information from available PPD files is
> displayed to assist with the addition or modification of a print queue.
> To quickly display printer information, the printmgr obtains PPD file printer
> information from the ppdcache file.
>
> With the number of printers constantly growing, the set of PPD files delivered
> with Solaris can quickly become out-of-date. While a PPD file not delivered
> with Solaris can be added to the system using the lpadmin -n option, a
> gzipped version is not added to the PPD repository, and more importantly, the
> ppdcache file utilized by the printmgr is not updated with the new PPD file
> information. Since there is currently no means to update the ppdcache file,
> users are frustrated that they are unable to add a print queue for their
> new wizbang printer using the printmgr. See CRs 6236968 "no documented way
> to add PPD file to ppdcache", and 6302561 "gimpprint drivers unavailable/PPD's
> missing/ijsgimpprint missing from release".
FYI, If I remember correctly the reason why no gimp-print ppd files were
delivered (in SUNWgimpprint) was because at the time (2+ years ago) the
gimp-print opensource project had stopped delivering them with their
package - I think the plan was that they would be delivered with
foomatics but not the version that was integrated into the wos at the
time. I think for the Companion CD (CCD) version I borrowed them from
any earlier version of the gimp-print package. I don't know where they
are now because I don't think they are still in the latest foomatic stuff.
>
> One additional note to be made is that the Free Standards Group (FSG)
> OpenPrinting Group is working on standardizing some installation locations
> for PPD files and print drivers so that printer vendors and driver suppliers
> have a common place to install regardless of print service or OS distribution.
> As of the writing of this document, the following would be the location of
> PPD files:
>
> /usr/share/ppd/{supplier}/{language}/{manufacturer}/{manufacturer}-{model}[-{extra}]-{language}.ppd
>
> where
> - {supplier} is the name of the manufacturer or project that supplied
> the files
>
> - {manufacturer} is the manufacturer (MFG) value from the
> IEEE1284 DeviceId
>
> - {model} is the model (MDL) value from the IEEE1284 DeviceId
> language is the language portion of a locale extra is supplier defined
>
> - whitespace and dash(-) are replaced with underscore(_) in {} values
>
> For example:
> /usr/share/ppd/foomatic/HP/HP-LaserJet_4050-o_pxlmono-en.ppd
Shouldn't this example path have a {language}/ dir in it
(foomatic/en/HP) as per above?
>
>
> DESCRIPTION
> This project will provide the user with a public tool (ppdmgr) to add PPD
> files to the to the PPD repository and reflect (update or rebuild) the
> PPD repository modifications in the ppdcache file. lpadmin will be
> modified to exec the new tool to add the PPD file into the PPD repository,
> allow the specification of a "label" (discussed below), and to modify the
> path to the original PPD path in the printers configuration file.
> printmgr will be modified to display the "label" information.
>
> As noted above, this project will be to provide the ability to add PPD files
> to a system running Solaris. The ppdmgr will be able to run as root or lp.
> In the future, this capability can be opened up to non-root privileged users.
> Other possible actions which can be added in the future include delete,
> and query or list actions.
>
>
> The directory tree of the PPD file repository currently delivered with Solaris
> is as follows:
>
> /usr/lib/lp/model/ppd/
> / / \ \
> / / \ \
diagram got me a bit confused to start with, it might be better as ...
/usr/lib/lp/model/ppd
|
|
-------------------------------------
| | | |
> manufacturer/ ppdcache system/ user/
> |
> |
> <Manufacturer>/
> / | \
> / | \
> <ppd_file1> <ppd_file2> ... <ppd_fileN>
>
> where Manufacturer is determined by reading the Manufacturer field from
> the PPD file and <ppd_fileN> is a gzipped PPD file with the extension
> ".ppd.gz".
> This directory structure will be modified to align with the location decided
> upon by FSG OpenPrinting Group, and to allow for package adds and deletes,
> updates, and patches, as well as to allow diskless clients to also take
> advantage the ability to add PPD files and update the ppdcache
> /usr/lib/lp/model/ppd/manufacturer, /usr/lib/lp/model/ppd/user,
> and /usr/lib/lp/model/ppd/ppdcache will no longer be needed.
>
>
> As specified by FSG OpenPrinting Group, all PPD files will now be delivered
> under /usr/share/ppd/<supplier>. Thus, the directory "system" under which
> PPD files are currently delivered with the Solaris, will now be a symlink
> to /usr/share/ppd. With this project, the directory tree of the PPD file
> repository will be modified to include 2 new repository areas: one new
> repository area, /usr/share/ppd/, will be for the delivery of PPD files
> via pkgadd or patch, cache files associated with the delivered PPD files
> (found under /usr/share/ppd/ppd/ppdcache/) as well as a new
typo I think - share/ppd/ppd/ppdcache -> share/ppd/ppdcaches/
> SUNWManufAliases file (see New Manufacturer Aliases File
> section below for more information on this new file), and the other new
> repository area, /var/lp/ppd, will be to store PPD files added using the
> new ppdmgr utility, the ppdcache file, as well as intermediary caches used
> to update the main ppdcache file more efficiently. The proposed directory
> tree
> of the PPD file repository delivered with Solaris is as follows:
>
> /usr/lib/lp/model/ppd/system----
> /
> /
I assume this means symbolic link ?
> /
> /
> /
> `--> /usr/share/ppd/
>
> / / / \ \
> / / / \ \
> <supplier1>/ ... <supplierN>/ ppdcaches/ SUNWManufAliases
> | \ \
> | \ \
> <language>/ <language>/ <supplier1>...<supplierN>
How will a manufacturer's package that delivers a ppdcaches/<supplier>/
cache file append this to the main /var/lp/ppd/ppdcache file used by
printmgr?
Also I assume these ppdcaches/<supplier>/ cache files are fixed and will
not change during run-time (that goes into /var/lp/ppd/cache/<label>/ ?
> | |
> | |
> <Manufacturer>/ <Manufacturer>/
> / | \ / | \
> / | \ / | \
> <ppd_file1>...<ppd_fileN> <ppd_file1>...<ppdfileN>
>
>
>
> /var/lp/ppd/
> / / | \ \ \
> / / | \ \ \
> caches/ ppdcache user <label1> ... <labelN>
> / | \ | \ ...
> / | \ | \ ...
> <label1> ... <labelN> <Manufacturer>/ <Manufacturer>/
> / | \ / | \
> / | \ / | \
> <ppd_file1>...<ppd_fileN> <ppd_file1>...<ppdfileN>
>
>
>
> A directory "user" will be added under /var/lp/ppd to store PPD files
> added by users where no label is specified. In addition, user specified
> label directories will be created under /var/lp/ppd when a user adds a
> PPD file using the ppdmgr with a specified label. For more information
> on "label", see the Introduction of "label" section below.
> The ppdcache file, used by the printmgr, will now be maintained under
> /var/lp/ppd/ppdcache, as well as intermediary cache files used to
> update /var/lp/ppd/ppdcache. These intermediary cache files will be
> maintained under a directory, /var/lp/ppd/caches, for each labeled grouping
> of PPD files.
>
> The following sections provide a more detailed description of the new label
> grouping of PPD files, a new file containing known manufacturer aliases,
> new cache files, new ppdmgr utility, as well as modifications to lpadmin
> and printmgr.
>
> Introduction of "label"
> -----------------------
> With this project, a new term "label" will be used to describe a grouping of
> PPD files. The label refers to a user selected directory name in the PPD
> repository. Thus, every <supplier> directory delivered under
> /usr/share/ppd will automatically become a label. Labels allow
> users to organize their PPD files under a label of their own choosing, and
> to easily identify their label when adding or modifying a printer using
> the printmgr. When a user chooses to add a PPD file under a specified
> label that does not exist yet on the system, a new directory will be created
> under /var/lp/ppd/user with the specified label name. The PPD file will be
> added under the directory with the specified label name.
>
> As stated above, every <supplier> directory under /usr/share/ppd will
> automatically be considered a label name. For example, for foomatic supplied
> PPD files delivered under /usr/share/ppd/foomatic, the label is considered
> to be "foomatic". When choices are provided to the user when adding or
> modifying a printer using the printmgr, the label can be displayed along
> with the PPD file selection to allow the user to distinguish from possible
> duplicate manufacturer entries.
>
> With this project, any labels begining with the string "SUNW" are reserved,
> and may not be specified by users with the ppdmgr utility. In addition,
> the label "all" is also reserved, and only selectable under certain
> conditions. These conditions are discussed in the description of each of
> the options for the new ppdmgr utility below.
>
>
> New Manufacturer Aliases File
> -----------------------------
> In addition, this project will introduce a new private file,
> /usr/share/ppd/SUNWManufAliases, which will be used to keep track of
> possible aliases used in PPD files for the Manufacturer entry. A one
> line entry for each manufacturer in which multiple aliases exist is added to
> this file. Each line will have the form
> <Manuf>|<alias1>[[|<alias2>]...[|<aliasN]]
> For example, the following will be the contents of the ManufAliases file
.... shouldn't that be SUNWManufAliases (and elsewhere)
> to be delivered with this project.
>
> tamarisk# cat SUNWManufAliases
> HP|hewlett-packard
> Okidata|oki
> Minolta|minolta-qms
>
> If a case insensitive search for the Manufacturer entry from a PPD file
> indicates it has an alias in the ManufAliases file,
> then the first entry on the line will be used instead of the alias. If a
> PPD file contains a Manufacturer name of HEWLETT-PACKARD, then the actual
> Manufacturer name used is HP. Note: this is only used to store PPD files
> added to a label using the ppdmgr utility.
Is there going to be a utility the user (printer manufacturer, etc) can
use to update this SUNWManufAliases file to add their own stuff? If so
maybe the file should be in /var
>
> New Caches Directory and Cache Files
> ------------------------------------
> The format of the ppdcache file used by the printmgr will remain the
> same as delivered today, however will be moved from
> /usr/lib/lp/model/ppd/ppdcache to /var/lp/ppd/ppdcache. Suppliers can
> deliver a cache of the PPD files they deliver in
> /usr/share/ppd/ppdcaches/<supplier>. Cache files delivered from suppliers
> will be used to update and rebuild the ppdcache file used by the
> printmgr. If a cache file is not delivered with a supplier's PPD files,
> then one will be generated and located in /var/lp/ppd/caches/<supplier>.
> All labeled cache files which are generated to reflect the printer
> information for all PPD files associated with the label in the PPD
> repository.
Not really sure I understood the above sentence
> In order to update the ppdcache file, intermediary cache files,
> of the same format, will be maintained in a private directory
> /var/lp/ppd/caches. For each labeled grouping of PPD files a cache file
> with the same label will exist under the cache directory. Each <supplier>
> of PPD files will be considered a label. For example, a cache file for the
> supplier "foomatic" PPD files will be maintained under
> /var/lp/ppd/caches/foomatic. The location of the ppdcache file used by
> the printmgr, and updated via the ppdmgr, will be /var/lp/ppd/ppdcache.
> When the ppdcache file needs to be updated or rebuilt, the intermediary
> cache file under /var/lp/ppd/caches are used to update or build the ppdcache
> file efficiently.
>
> PPD Manager
> -----------
> The PPD Manager (ppdmgr) tool will be delivered as /usr/lib/lp/bin/ppdmgr with
> a symlink from /usr/sbin/ppdmgr to /usr/lib/lp/bin/ppdmgr. With this project,
> the user may add a PPD file to the system, optionally supply a label to
> associate the PPD file with, request an update of the cache associated with
> a specific (or all) label, or request an rebuild of cache associated with
> a specific (or all) label.
>
> In general, if an error message is displayed, it will be displayed on stderr,
> and the ppdmgr will exit with and error code. Thus, no logging will be
> performed.
what state will the cache file(s) be left in if an error occurs while it
is updating them?
>
> The proposed synopsis for ppdmgr:
>
> ppdmgr [ -a <ppd_path> | -r | -u ] [ -l <label> ] [-w]
>
>
> The following is a more in depth description of each of the proposed
> options:
>
> To add a PPD file to the system
> -------------------------------
> -a <ppd_file_path>
Just wonder if it would be better to use the same option letter (-n)
that lpadmin uses for this?
>
> Copies the PPD file specified in ppd_file_path to the PPD
> repository, then updates the cache to reflect the change.
> Unless the -l option is also specified, the default
> label the PPD file will be associated with is "user".
>
> Label verification will be performed.
>
> If a reserved label name "all" or beginning with "SUNW" is
> specified, an error message will be printed and ppdmgr will
> exit.
>
> Path verification will be performed.
>
> If the specified ppd_file_path is not accessible, an
> error message will be printed and ppdmgr will exit.
>
> If ppd_file_path does not end in either ".ppd", or
> ".ppd.gz" (gzipped) extension, then an error message
> will be printed and ppdmgr will exit. In the future,
> support for other extensions such as .ppd.bz (bzipped)
shouldn't that be .ppd.bz2
> can be provided.
>
> PPD file verification will be performed.
>
> If the first line of ppd_file_path does not begin with
I assume you mean the first line of the contents of <ppd_file_path> here?
> *PPD-Adobe: "4.3",
> then an error message will be printed and ppdmgr will exit.
Are we sure they will always have this in the first line?
>
> Other PPD file verification/validation tests can be added
> in the future.
>
> The destination path for the copied PPD file will be determined
> by the label (-l) name and Manufacturer name contained within
> the specified PPD file.
>
> The Manufacturer name will be read from the PPD file
> specified with ppd_file_path. If unsuccessful, an
> error message will be printed and ppdmgr will exit.
Are we sure that PPD files will always have 'Manufacturer' defined in them?
>
> Since the Manufacturer name can have multiple aliases,
> the Manufacturer name is an alias in
> /usr/share/ppd/SUNWManufAliases, the actual Manufacturer
> name will be used instead.
>
> The destination path determined from the above steps is
> /var/lp/ppd/<label>/<Manufacturer>/<ppd_file>,
> where <ppd_file> is the basename of ppd_file_path.
>
> Parent directories of the destination path are created,
> if needed. If unsuccessful, an error message will be
> printed and ppdmgr will exit.
>
> If a gzipped version (.ppd.gz extension) of
> the PPD file already exists in the PPD file repository,
> and the gzipped versions are not duplicates,
> a message will be printed, and ppdmgr will exit.
>
> ppd_file_path is copied to the destination path. If
> unsuccessful, an error message will be printed and
> ppdmgr will exit.
>
> The update action (see -u) is then applied to reflect the
> change in the ppdcache file.
Can a user add a ppd file into /var/lp/ppd that is already in
/usr/share/ppd with the same name?
>
>
> To specify a PPD repository label
> ---------------------------------
> -l <label>
>
> The label is used to group PPD files in the PPD repository.
> Opaque to the user, <label> is actually the name of
> the <supplier> directory under /var/lp/ppd, i.e.,
>
> /var/lp/ppd/<label>
>
> or is the associated intermediary cache file under
> /var/lp/ppd/caches/<label> associated with the labeled
> grouping of PPD files in /var/lp/ppd/<label>.
>
> For example, with the following PPD file:
>
> /usr/share/ppd/foomatic/en/HP/HP-LaserJet_4050-o_pxlmono-en.ppd.gz
>
> the ppdmgr would consider "foomatic" to be the label.
> The intermediary cache file associated with the "foomatic"
> label would be maintained in
>
> /var/lp/ppd/caches/foomatic
>
> The specified label must a valid directory name (i.e.,
typo "label must a valid" -> "label must be a valid"
> mkdir() would succeed). However, a label must not be either
> "." or "..", and must not contain a slash '/' character.
> If an invalid label is specified, then an error message
> will be printed, and the ppdmgr will exit.
>
> Reserved label names include any label beginning with "SUNW",
> and may not be specified with -a, -r, or -u.
>
> Another special reserved label "all" may only be specified with the
> -r or -u options.
>
> If reserved label is specified with the -l option, then an error
> message will be printed, and the ppdmgr will exit.
>
>
> To request a cache update
> -------------------------
> -u
>
> Updates the cache to reflect the printer information from
> PPD files in the PPD file repository. This action is also
> performed by default after a PPD file is added to the system with
> the -a option, or after a cache file was removed when a rebuild
> was requested with the -r option.
>
> The label is used to determine which cache to update.
>
> If the -l is also specified, and the label is not
> a reserved label beginning with "SUNW", then only
> the PPD file modifications associated with the
> specified label are reflected in the ppdcache file.
> Entries associated with other labels will remain
> as-is in the ppdcache file.
>
> If the "all" label is specified with the -l label, then
> all PPD file modifications associated with all labels,
> with the exception of any labels beginning with "SUNW",
> in the PPD repository will be reflected in the ppdcache file.
>
> If the -l is not specified, then, by default, only the
> PPD file modifications associated with the "user" label are
> reflected in the ppdcache file.
>
> Cache files associated with the label are updated.
>
> To update a cache, any unzipped PPD files in labels under
> /var/lp/ppd, are gzipped. If a differing gzipped version
> of the file already exists, an error message is printed,
> but continues.
>
> The cache is then sync'd with the list of PPD files
> associated with a label.
>
> A list of PPD files under the label name
> either in /var/lp/ppd/<label>
> or /usr/share/ppd/<label>,
> as well a list of PPD files contained in the
> associated labeled cache file in
> /var/lp/ppd/caches/<label>
> are generated.
>
> These two lists are compared against each other.
>
> If a PPD file is associated with the label, but
> isn't in the cache file list, then a cache entry for
> that PPD file is added to the label cache file.
>
> If a PPD file is listed in the ppdcache, but no longer
> is in the list of PPD files associated with the label,
> then the cache entry is deleted from the label cache.
>
> If a PPD file associated with the label is in
> the cache file list, but the ppdcache file entry
> information is out-of-date, then the cache
> entry is deleted from the label cache and a cache entry
> for the newer cache entry is added to the label
> cache file.
>
> All label cache files associated in the PPD repository are
> concatenated to produce the ppdcache file.
>
> To request a cache rebuild
> --------------------------
> -r
>
> Rebuilds cache. The rebuild is actually made up of two steps:
> remove a cache file associated with a label, then regenerate the
> cache file using update (see -u).
>
> A rebuild is very similar to an update, however, can take quite a bit
> more time a cache file associated with a label are totally regenerated.
> When the cache file regeneration is complete, then the cache files
> associated with all labels in the PPD repository are concatenated
> to produce the ppdcache file.
>
> The label is used to determine which cache to rebuild.
>
> If the -l is also specified, and the label is not a
> reserved label beginning with "SUNW", then the cache
> entries for the specified label are totally rebuilt
> to reflect the PPD information from all the PPD files
> associated with the specified label.
>
> If "all" is specified with the -l option, then cache entries
> for all PPD files associated with all labels in the PPD
> repository are rebuilt except for any labels beginning with
> "SUNW".
>
> If -l is not specified, the default label is "user".
>
> Delete the label cache.
>
> Update the label cache (see -u).
>
> Display Full Path of PPD File in the Repository
> -----------------------------------------------
> -w
>
> If specified with the -a option, and the -a option is
> successful, then the full path of the PPD file that was
> added is displayed on stdout. Otherwise, -w has no affect.
>
> Other ppdmgr notes:
>
> Users will be encouraged to add PPD files to the system using
> either the lpadmin
maybe you should add "(see 'lpadmin Modifications' below)" next to
lpadmin as this is new for lpadmin.
or the ppdmgr utilities. However, if a
> PPD file is copied to the PPD file repository under a
> non-reserved label, then the next time a ppdmgr update action is
> requested, the printer information from the copied PPD file will
> be reflected in the cache.
>
> lpadmin Modifications
> ---------------------
> The ability to specified a label, as well as to copy a file in the PPD
> file repository and update the ppdcache file will be added to lpadmin.
>
> A new command line option, -y, will be added to lpadmin to allow the
> user to specify a label name to associate the PPD file with. The
> same rules that apply for the ppdmgr -l option apply for the
> lpadmin -y option.
if '-y' is not given does it go into label 'user'?
What if the user does not want to add the ppd file into the repository
(eg. it's a very special unique bodged ppd for a unique print q), can
they still do that?
>
> lpadmin will be modified to call the new ppdmgr utility to add the
> new PPD file to the PPD repository in /var/lp/ppd,
> with the associated label and to reflect the addition in the
> ppdcache file. If the call to the ppdmgr utility fails, lpadmin
> will exit with an appropriate message for the exit status received.
>
> The PPD path reflected in the /etc/lp/printers/<printer>/configuration
> file will now be the path of the copied PPD file on the system. This
> path is determined by the combination of the basename of the specified
> PPD file, the label, and the Manufacturer name in PPD file (i.e.,
> the destination path will be
> /var/lp/ppd/<label>/<Manufacturer>/<ppd_file>.
>
>
> printmgr Modifications
> ----------------------
> Since the location of the ppdcache file used by the printmgr will be
> moved from /usr/lib/lp/model/ppd/ppdcache to /var/lp/ppd/ppdcache,
> the printmgr will be updated to get it's PPD file information from
> this new location.
>
> The ability to display label information will be added in the printmgr
> to eliminate the possibility of having seemingly duplicate entries for the
> Printer Driver field when adding or modifying a printer. This label will
> be displayed along with the printer driver. For example, if multiple
> entries exist under the same Manufacturer but different labels, i.e.,
> the a Brother DCP-1200 printer model, then the basename of the label within
> parenthesis will be prepended to the Printer Driver field:
> (foomatic) Foomatic/hl1250 (recommended)
> (Photo) Foomatic/hl1250 (recommended)
>
1. Will there be a GUI tool to do the functionality of ppdmgr? Maybe it
could be part of printmgr.
2. When is the printmgr going to be updated so that a given print q's
ppd file options can be changed, eg. paper size A4, etc.? The CUPS web
admin tool can do this.
>
> In addition, the help application documentation will be updated.
>
> DOCUMENTATION
> The following documentation will be updated to reflect the changes associated
> with this project:
> lpadmin(1M)
> Advanced system administration guide
>
> The following man page will be added for the ppdmgr:
> ppdmgr(1M)
>
As a said all minor and wit-picking stuff, so it looks good to me.
Hope that helps
Paul :-)