pkgmogrify man page on OpenIndiana

Man page or keyword search:  
man Server   20441 pages
apropos Keyword Search (all sections)
Output format
OpenIndiana logo
[printable version]

User Commands						 pkgmogrify(1)

NAME
     pkgmogrify - image packaging system manifest transmogrifier

SYNOPSIS
     /usr/bin/pkgmogrify [-vi] [-I includedir ...] [-D macro=value ...]
	   [-O outputfile] [-P printfile] [inputfile ...]

DESCRIPTION
     pkgmogrify(1) provides for programmatic editing of package manifests
     to simplify the typical transformations needed when automating
     software builds and package publication.

     pkgmogrify(1) provides the following:

     * Macro replacement to facilitate sharing of a single manifest across
       various architectures and platforms.

     * Inclusion of other manifests or manifest fragments such as standard
       components and transforms.

     * Transformation of package actions, including the modification,
       deletion, or addition of action attributes.

OPTIONS
     The following options are supported:

     -D name=value
	  Defines "name" as a macro, with the value "value".  Macros appear
	  in the input file as "$(macro)"; substitution is repeated until
	  no more translations are found.  Common idioms include:

      *	  Elimination of lines in a manifest on other architectures by
	  using an architecture-specific tag at the beginning of the line:

	      $(sparc_ONLY)file ....

	  When processing the SPARC architecture, this macro would be set
	  to the empty string.	When processing other architectures, this
	  macro would be set to '#' on the command line, thus eliminating
	  this action from the manifest on the current architecture.

      *	  Specifying platform-specific portions of pathnames, such as the
	  name of the 64-bit architecture directory for executables and
	  libraries:

	      file NOHASH path=usr/bin/$(ARCH64)/cputrack ...

	  Again, the expectation is that these macros would be set to the
	  desired value on the command line; there are no predefined macro
	  values.

     -I include_directory
	  Adds the specified directory to the search path for both files
	  specified on the command line and embedded include directives.

     -O outputfile
	  Write manifest output to the specified file.	The file is not
	  written if an error occurs or if a transform directive causes an
	  abort operation.  By default, manifest output is written to
	  stdout.

     -P printfile
	  Write output resulting from transform directive print operations
	  to the specified file.  The file is not written if an error
	  occurs or if a transform directive causes an abort operation.	 By
	  default, print output is written to stdout.

     -i	  Ignore include directives in files; only files specified on the
	  command line (or stdin) are processed.

     -v	  Write out comments into output manifest showing effect of
	  transforms to aid debugging.

     --help or -?
	  Displays a usage message.

EMBEDDED DIRECTIVES
     There are two types of directives supported in manifest files: include
     directives and transform directives.

     Include directives are of the form:

	 <include file>

     This causes pkgmogrify(1) to search for a file named "file" first in
     the current directory and then in the directories specified with the
     -I option.	 If found, the contents of the file are inserted into the
     manifest at the point at which the directive is encountered.  If not
     found, pkgmogrify(1) exits with an error.

     Transform directives are of the form:

	 <transform matching-criteria -> operation>

     These are accumulated until all inputs have been read into memory, and
     then applied to the actions in the order in which they were
     encountered.

     Matching criteria are of the form:

	 [action-type ... ] [attribute=<value-regexp> ...]

     One of the action-types specified must match.  All of the attributes
     specified must match.  The regular expression syntax used is that of
     Python; more information is available via the command "pydoc re" or
     (more completely) at http://docs.python.org/dev/howto/regex.html.	The
     regular expression is anchored at the beginning, but not the end, so
     the regular expression matching files by their extensions would have
     to include a leading ".*" and, for safety, a trailing "$".

     Multiple criteria may be specified, separated by spaces.

     The following operations are available:

     add       Add a value to an attribute.  Two arguments are taken.  The
	       first is the name of the attribute, and the second is the
	       value.

     default   Set the value of an attribute if it doesn't already exist.
	       The same two arguments are taken as for "add".

     delete    Remove attribute values.	 Two arguments are taken.  The
	       first is the name of the attribute, and the second is a
	       regular expression to match the attribute values deleted.
	       Unlike the regular expression used to match an action, this
	       expression is unanchored.

     drop      Discards this action.

     edit      Modifies an attribute of the action.  Three arguments are
	       taken.  The first is the name of the attribute, the second
	       is a regular expression matching the attribute value, and
	       the third is the replacement string substituted for the
	       portion of the value matched by the regular expression.
	       Unlike the regular expression used to match an action, this
	       expression is unanchored.  Normal regular expression
	       backreferences, of the form '\1', '\2', etc., are available
	       in the replacement string, if there are groups defined in
	       the regular expression.

     emit      Emit a line to the manifest output stream.  This must be a
	       valid action string, empty (which will result in a blank
	       line), or a comment (a "#" followed by arbitrary text).

     exit      Terminate manifest processing.  No manifest is output and no
	       print operations are applied.  If one argument is given, it
	       must be an integer, and it is used as the exit code.  The
	       default is 0.  If two arguments are given, the first is the
	       exit code, and the second is a message to be printed to
	       stderr.

     print     Print a message to the output file specified with -P.

     set       Set the value of an attribute.  The same two arguments are
	       taken as for "add".

     All operations aside from "delete" and "drop" take (possibly optional)
     arguments whose contents will end up in the output stream.	 These
     strings can contain three different kinds of special tokens which
     allow the output to contain information that isn't based on a fixed
     transformation of each action.

     The first kind of substitution allows the operation to refer to the
     values of attributes of the current action by putting the name of the
     attribute inside parentheses following a percent sign.  For example,
     "%(alias)" refers to the value of the action's "alias" attribute.

     Several synthetic attributes exist.  Two are unique to pkgmogrify(1):
     pkg.manifest.filename and pkg.manifest.lineno.  These refer to the name
     of the file in which the action was found and the line on which it was
     found, respectively.  Three others are similar to ones used in pkg(1):
     action.hash, action.key, and action.name, which refer to the hash
     value of the action if the action carries a payload, the value of the
     key attribute, and the name of the action type, respectively.  For
     actions with payloads, the "set" operation can change the hash of the
     action by operating on the action.hash attribute.

     If the attribute whose value is requested doesn't exist, pkgmogrify(1)
     will exit with an error.  To prevent this, the attribute name may be
     followed by ";notfound=" and a value to substitute in its place.  For
     example "%(alias;notfound='no alias')" will print the value of the
     attribute "alias" if it exists, and "no alias" otherwise.

     If the attribute whose value is requested is multi-valued, each value
     will be printed, separated by spaces.  Similarly to the "notfound"
     token, the tokens "prefix", "suffix, and "sep" may be used to change
     this behavior.  The string denoted by "prefix" is prepended to each
     value, the string denoted by "suffix" is appended to each value, and
     "sep" is placed in between the suffix of one value and the prefix of
     the next.

     Similarly to action attributes, pkgmogrify(1) directives may reference
     package attributes using braces instead of parentheses: "%{pkg.fmri}".
     At the point at which the transform directive is applied, the
     attribute must have been defined in a set action, or it is treated as
     "notfound", described above.  When the processing reaches the end of
     the manifest file describing the package, the attributes are cleared
     for the next package.

     It is useful not only to reference package attributes as if they were
     action attributes, but also to match on them, and even temporarily
     modify them.  Therefore a synthetic action name, "pkg", is available
     (only in the context of pkgmogrify(1)) for use in these situations.

     When pkgmogrify(1) finishes reading a manifest specified on the
     commandline and that manifest defined a "pkg.fmri" package attribute,
     it will create this synthetic "pkg" action, whose attributes are the
     package's attributes.  A <transform> directive may then match on this
     action, just like any other action type.

     Operations on a "pkg" action are special, though, in that they take
     place only in memory, and do not directly affect the emitted manifest.
     For instance, trying to set an attribute on a "pkg" action via the
     "add", "default", or "set" operations will not result in a "set"
     action being added to the manifest, though it will be available for
     other <transform> directives to match on.	Attempting to "emit" a
     "pkg" action will cause an error.	If you wish to add a package
     attribute, emit a "set" action instead.

     The third kind of substitution is a backreference, not like the ones
     usable in the "edit" operation, but a reference to groups listed in
     the transformation match on the left-hand side of the "->".  These are
     indicated by "%<1>", "%<2>", etc., in the order seen in the matching
     criteria.

     The order of processing is as follows:

     1) Lines are read from input file(s).
     2) Macros are applied.
     3) <include ...>  and <transform> directives are processed causing
	additional files to be found and read in.
     4) Once all input has been accumulated, each line in the input is
	converted into actions and all transforms applied.
     5) Once processing is complete and successful, the output is written.

EXAMPLES
     Example 1:	 Add tags to SMF manifests so they get imported when the
     package is installed on a live system.

	 <transform file path=(var|lib)/svc/manifest/.*\.xml -> \
	     add restart_fmri svc:/system/manifest-import:default>

     Example 2:	 Move files from usr/sfw/bin to usr/bin.

	 <transform file -> edit path usr/sfw/bin usr/bin>

     Example 3:	 Add "reboot-needed" tags to files under /kernel which
     aren't .conf files.  This can also be done in a single transform rule
     with regular expression magic, but this formulation will make more
     sense to most people.  Note that this leverages how transforms are
     applied to each action in the order seen in the input files.

	 <transform file path=kernel/.* -> set reboot-needed true>
	 <transform file path=kernel/.*\.conf -> delete reboot-needed .*>

     Example 4:	 Convert the package attribute "pkg.fmri" into a depend
     action to become part of an incorporation.

	 <transform set name=pkg.fmri -> \
	     emit depend type=incorporate fmri=%(value)>
	 <transform set name=pkg.fmri -> drop>

     Example 5:	 Print a comma-separated list of quoted and prefixed bug
     numbers.

	 set name=bugs value=12345 value=54321 value=13579 value=97531
	 <transform set name=bugs -> \
	     print %(value;sep=",";prefix="bug='";suffix="'")>

     Example 6:	 Safely print a message even when an attribute is missing.

	 <transform driver -> print Found aliases: %(alias;notfound=<none>)>

     Example 7:	 Set some default permissions.

	 <transform file dir -> default owner root>
	 <transform file dir -> default group bin>
	 <transform file -> default mode 0444>
	 <transform dir -> default mode 0755>

     Example 8:	 For any package which isn't marked obsolete, add a
     dependency on the incorporation for the consolidation that delivers
     it.  This set of transforms must occur after the manifest has been
     read in, or the dependency will always be emitted.	 Because modifying
     a "pkg" action has no permanent effect, there is no need to clean up
     attributes matching "pkg.obsolete=false".

	 <transform pkg -> default pkg.obsolete false>
	 <transform pkg pkg.obsolete=false -> emit depend \
	     fmri=consolidation/$(CONS)/$(CONS)-incorporation type=require>

     Example 9:	 Error out with a message when an obsolete attribute is
     found in a manifest.

	 <transform file dir link hardlink opensolaris.zone=.* -> \
	     exit 1 The opensolaris.zone attribute is obsolete.>

     Example 10: Set the locale facet appropriate for the pathname under
     consideration.

	 <transform dir file link hardlink path=.*/locale/([^/]+).* -> \
	     default facet.locale.%<1> true>

EXIT STATUS
     The following exit values are returned:

     0	   Everything worked.

     1	   Something bad but anticipated happened.

     2	   Invalid command line options were specified.

     99	   Unexpected processing error

ATTRIBUTES
     See attributes(5) for descriptions of the following attributes:
     ____________________________________________________________
    |	    ATTRIBUTE TYPE	  |	  ATTRIBUTE VALUE	|
    |_____________________________|_____________________________|
    | Availability		  | SUNWipkg			|
    |				  | pkg:/package/pkg		|
    |_____________________________|_____________________________|
    | Interface Stability	  | None / Under Development	|
    |_____________________________|_____________________________|

SEE ALSO
     pkg(1), attributes(5), pkg(5)

NOTES
     The image packaging system is an under-development feature.
     Command names, invocation, formats, and operations are all subject
     to change.	 Development is hosted in the OpenSolaris community
     at

     http://hub.opensolaris.org/bin/view/Project+pkg/
[top]

List of man pages available for OpenIndiana

Copyright (c) for man pages and the logo by the respective OS vendor.

For those who want to learn more, the polarhome community provides shell access and support.

[legal] [privacy] [GNU] [policy] [cookies] [netiquette] [sponsors] [FAQ]
Tweet
Polarhome, production since 1999.
Member of Polarhome portal.
Based on Fawad Halim's script.
....................................................................
Vote for polarhome
Free Shell Accounts :: the biggest list on the net