api_errors.py revision 2097
1516N/A#!/usr/bin/python
565N/A#
565N/A# CDDL HEADER START
565N/A#
565N/A# The contents of this file are subject to the terms of the
565N/A# Common Development and Distribution License (the "License").
565N/A# You may not use this file except in compliance with the License.
565N/A#
565N/A# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
565N/A# or http://www.opensolaris.org/os/licensing.
565N/A# See the License for the specific language governing permissions
565N/A# and limitations under the License.
565N/A#
565N/A# When distributing Covered Code, include this CDDL HEADER in each
565N/A# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
565N/A# If applicable, add the following below this CDDL HEADER, with the
565N/A# fields enclosed by brackets "[]" replaced with your own identifying
565N/A# information: Portions Copyright [yyyy] [name of copyright owner]
565N/A#
565N/A# CDDL HEADER END
565N/A#
926N/A
926N/A#
1895N/A# Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
926N/A#
565N/A
2026N/Aimport errno
1050N/Aimport os
926N/Aimport urlparse
926N/A
926N/A# EmptyI for argument defaults; can't import from misc due to circular
926N/A# dependency.
926N/AEmptyI = tuple()
838N/A
565N/Aclass ApiException(Exception):
2034N/A def __init__(self, *args):
2034N/A Exception.__init__(self)
2034N/A self.__verbose_info = []
1540N/A
1540N/A def __unicode__(self):
1540N/A # To workaround python issues 6108 and 2517, this provides a
1540N/A # a standard wrapper for this class' exceptions so that they
1540N/A # have a chance of being stringified correctly.
1968N/A return unicode(str(self))
1540N/A
2034N/A def add_verbose_info(self, info):
2034N/A self.__verbose_info.extend(info)
2034N/A
2034N/A @property
2034N/A def verbose_info(self):
2034N/A return self.__verbose_info
565N/A
1710N/Aclass ImageLockedError(ApiException):
1710N/A """Used to indicate that the image is currently locked by another thread
1710N/A or process and cannot be modified."""
1710N/A
1710N/A def __init__(self, hostname=None, pid=None, pid_name=None):
1710N/A ApiException.__init__(self)
1710N/A self.hostname = hostname
1710N/A self.pid = pid
1710N/A self.pid_name = pid_name
1710N/A
1710N/A def __str__(self):
1710N/A if self.pid is not None and self.pid_name is not None and \
1710N/A self.hostname is not None:
1710N/A return _("The image cannot be modified as it is "
1710N/A "currently in use by another package client: "
1710N/A "%(pid_name)s on %(host)s, pid %(pid)s.") % {
1710N/A "pid_name": self.pid_name, "pid": self.pid,
1710N/A "host": self.hostname }
1710N/A if self.pid is not None and self.pid_name is not None:
1710N/A return _("The image cannot be modified as it is "
1710N/A "currently in use by another package client: "
1710N/A "%(pid_name)s on an unknown host, pid %(pid)s.") % {
1710N/A "pid_name": self.pid_name, "pid": self.pid }
1710N/A elif self.pid is not None:
1710N/A return _("The image cannot be modified as it is "
1710N/A "currently in use by another package client: "
1710N/A "pid %(pid)s on %(host)s.") % {
1710N/A "pid": self.pid, "host": self.hostname }
1710N/A return _("The image cannot be modified as it is currently "
1710N/A "in use by another package client.")
1710N/A
565N/Aclass ImageNotFoundException(ApiException):
565N/A """Used when an image was not found"""
565N/A def __init__(self, user_specified, user_dir, root_dir):
565N/A ApiException.__init__(self)
565N/A self.user_specified = user_specified
565N/A self.user_dir = user_dir
565N/A self.root_dir = root_dir
565N/A
565N/Aclass VersionException(ApiException):
565N/A def __init__(self, expected_version, received_version):
565N/A ApiException.__init__(self)
565N/A self.expected_version = expected_version
565N/A self.received_version = received_version
565N/A
565N/Aclass PlanExistsException(ApiException):
565N/A def __init__(self, plan_type):
565N/A ApiException.__init__(self)
565N/A self.plan_type = plan_type
565N/A
1618N/A
1618N/Aclass PlanPrepareException(ApiException):
1618N/A """Base exception class for plan preparation errors."""
1618N/A pass
1618N/A
1618N/A
1755N/Aclass InvalidPackageErrors(ApiException):
1755N/A """Used to indicate that the requested operation could not be completed
1755N/A as one or more packages contained invalid metadata."""
1755N/A
1755N/A def __init__(self, errors):
1755N/A """'errors' should be a list of exceptions or strings
1755N/A indicating what packages had errors and why."""
1755N/A
1755N/A ApiException.__init__(self)
1755N/A self.errors = errors
1755N/A
1755N/A def __str__(self):
1755N/A return _("The requested operation cannot be completed due "
1755N/A "to invalid package metadata. Details follow:\n\n"
1755N/A "%s") % "\n".join(str(e) for e in self.errors)
1755N/A
1755N/A
1618N/Aclass LicenseAcceptanceError(ApiException):
1618N/A """Used to indicate that license-related errors occurred during
1618N/A plan evaluation or execution."""
1618N/A
1618N/A def __init__(self, pfmri, src=None, dest=None, accepted=None,
1618N/A displayed=None):
1618N/A ApiException.__init__(self)
1618N/A self.fmri = pfmri
1618N/A self.src = src
1618N/A self.dest = dest
1618N/A self.accepted = accepted
1618N/A self.displayed = displayed
1618N/A
1618N/A
1618N/Aclass PkgLicenseErrors(PlanPrepareException):
1618N/A """Used to indicate that plan evaluation or execution failed due
1618N/A to license-related errors for a package."""
1618N/A
1618N/A def __init__(self, errors):
1618N/A """'errors' should be a list of LicenseAcceptanceError
1618N/A exceptions."""
1618N/A
1618N/A PlanPrepareException.__init__(self)
1618N/A self.__errors = errors
1618N/A
1618N/A @property
1618N/A def errors(self):
1618N/A """A list of LicenseAcceptanceError exceptions."""
1618N/A return self.__errors
1618N/A
1618N/A
1618N/Aclass PlanLicenseErrors(PlanPrepareException):
1618N/A """Used to indicate that image plan evaluation or execution failed due
1618N/A to license-related errors."""
1618N/A
1618N/A def __init__(self, pp_errors):
1618N/A """'errors' should be a list of PkgLicenseErrors exceptions."""
1618N/A
1618N/A PlanPrepareException.__init__(self)
1618N/A self.__errors = pkgs = {}
1618N/A for pp_err in pp_errors:
1618N/A for e in pp_err.errors:
1618N/A pkgs.setdefault(str(e.fmri), []).append(e)
1618N/A
1618N/A @property
1618N/A def errors(self):
1618N/A """Returns a dictionary indexed by package FMRI string of
1618N/A lists of LicenseAcceptanceError exceptions."""
1618N/A
1618N/A return self.__errors
1618N/A
1618N/A def __str__(self):
1618N/A """Returns a string representation of the license errors."""
1618N/A
1618N/A output = ""
1618N/A for sfmri in self.__errors:
1618N/A output += ("-" * 40) + "\n"
1618N/A output += _("Package: %s\n\n") % sfmri
1618N/A for e in self.__errors[sfmri]:
1618N/A lic_name = e.dest.attrs["license"]
1618N/A output += _("License: %s\n") % lic_name
1618N/A if e.dest.must_accept and not e.accepted:
1618N/A output += _(" License requires "
1618N/A "acceptance.")
1618N/A if e.dest.must_display and not e.displayed:
1618N/A output += _(" License must be viewed.")
1618N/A output += "\n"
1618N/A return output
1618N/A
1618N/A
1019N/Aclass ActuatorException(ApiException):
1019N/A def __init__(self, e):
1019N/A ApiException.__init__(self)
1019N/A self.exception = e
1019N/A
1019N/A def __str__(self):
1019N/A return str(self.exception)
1019N/A
1618N/A
565N/Aclass PrematureExecutionException(ApiException):
565N/A pass
565N/A
1618N/A
1618N/Aclass AlreadyPreparedException(PlanPrepareException):
565N/A pass
565N/A
1618N/A
565N/Aclass AlreadyExecutedException(ApiException):
565N/A pass
565N/A
1618N/A
565N/Aclass ImageplanStateException(ApiException):
565N/A def __init__(self, state):
565N/A ApiException.__init__(self)
565N/A self.state = state
565N/A
1369N/A
1710N/Aclass InvalidPlanError(ApiException):
1710N/A """Used to indicate that the image plan is no longer valid, likely as a
1710N/A result of an image state change since the plan was created."""
1710N/A
1710N/A def __str__(self):
1710N/A return _("The plan for the current operation is no longer "
1710N/A "valid. The image has likely been modified by another "
1710N/A "process or client. Please try the operation again.")
1710N/A
1710N/A
1372N/Aclass ImagePkgStateError(ApiException):
1369N/A
1369N/A def __init__(self, fmri, states):
1369N/A ApiException.__init__(self)
1369N/A self.fmri = fmri
1369N/A self.states = states
1369N/A
1369N/A def __str__(self):
1369N/A return _("Invalid package state change attempted '%(states)s' "
1372N/A "for package '%(fmri)s'.") % { "states": self.states,
1372N/A "fmri": self.fmri }
1369N/A
1369N/A
565N/Aclass IpkgOutOfDateException(ApiException):
565N/A pass
565N/A
565N/Aclass ImageUpdateOnLiveImageException(ApiException):
565N/A pass
565N/A
1328N/Aclass RebootNeededOnLiveImageException(ApiException):
1328N/A pass
1328N/A
565N/Aclass CanceledException(ApiException):
565N/A pass
565N/A
565N/Aclass PlanMissingException(ApiException):
565N/A pass
565N/A
565N/Aclass NoPackagesInstalledException(ApiException):
565N/A pass
565N/A
685N/Aclass PermissionsException(ApiException):
685N/A def __init__(self, path):
685N/A ApiException.__init__(self)
685N/A self.path = path
685N/A
685N/A def __str__(self):
685N/A if self.path:
926N/A return _("Could not operate on %s\nbecause of "
926N/A "insufficient permissions. Please try the command "
926N/A "again using pfexec\nor otherwise increase your "
926N/A "privileges.") % self.path
685N/A else:
685N/A return _("""
685N/ACould not complete the operation because of insufficient permissions. Please
926N/Atry the command again using pfexec or otherwise increase your privileges.
685N/A""")
685N/A
879N/Aclass FileInUseException(PermissionsException):
879N/A def __init__(self, path):
879N/A PermissionsException.__init__(self, path)
879N/A assert path
879N/A
879N/A def __str__(self):
879N/A return _("Could not operate on %s\nbecause the file is "
879N/A "in use. Please stop using the file and try the\n"
879N/A "operation again.") % self.path
879N/A
1335N/A
1335N/Aclass ReadOnlyFileSystemException(PermissionsException):
1945N/A """Used to indicate that the operation was attempted on a
1335N/A read-only filesystem"""
1335N/A
1335N/A def __init__(self, path):
1335N/A ApiException.__init__(self)
1335N/A self.path = path
1335N/A
1335N/A def __str__(self):
1335N/A if self.path:
1335N/A return _("Could not complete the operation on %s: "
1968N/A "read-only filesystem.") % self.path
1335N/A return _("Could not complete the operation: read-only "
1335N/A "filesystem.")
1335N/A
1335N/A
565N/Aclass PlanCreationException(ApiException):
1141N/A def __init__(self, unmatched_fmris=EmptyI, multiple_matches=EmptyI,
926N/A missing_matches=EmptyI, illegal=EmptyI,
1945N/A badarch=EmptyI, installed=EmptyI, multispec=EmptyI,
1945N/A no_solution=False, no_version=EmptyI, missing_dependency=EmptyI,
1505N/A wrong_publishers=EmptyI, obsolete=EmptyI):
565N/A ApiException.__init__(self)
1505N/A self.unmatched_fmris = unmatched_fmris
1505N/A self.multiple_matches = multiple_matches
1505N/A self.missing_matches = missing_matches
1505N/A self.illegal = illegal
1505N/A self.badarch = badarch
1505N/A self.installed = installed
1505N/A self.multispec = multispec
1461N/A self.obsolete = obsolete
1505N/A self.no_solution = no_solution
1505N/A self.no_version = no_version
1505N/A self.missing_dependency = missing_dependency
1505N/A self.wrong_publishers = wrong_publishers
838N/A
565N/A def __str__(self):
616N/A res = []
1141N/A if self.unmatched_fmris:
616N/A s = _("""\
988N/AThe following pattern(s) did not match any packages in the current catalog.
988N/ATry relaxing the pattern, refreshing and/or examining the catalogs:""")
926N/A res += [s]
1141N/A res += ["\t%s" % p for p in self.unmatched_fmris]
565N/A
1505N/A if self.wrong_publishers:
1505N/A s = _("The following patterns only matched packages "
1505N/A "that are from publishers other than that which "
1505N/A "supplied the already installed version of this package")
1505N/A res += [s]
1505N/A res += ["\t%s: %s" % (p[0], ", ".join(p[1])) for p in self.wrong_publishers]
1505N/A
565N/A if self.multiple_matches:
988N/A s = _("'%s' matches multiple packages")
565N/A for p, lst in self.multiple_matches:
922N/A res.append(s % p)
922N/A for pfmri in lst:
633N/A res.append("\t%s" % pfmri)
616N/A
1505N/A if self.missing_matches:
1505N/A s = _("'%s' matches no installed packages")
1505N/A res += [ s % p for p in self.missing_matches ]
616N/A
1505N/A if self.illegal:
1505N/A s = _("'%s' is an illegal fmri")
1505N/A res += [ s % p for p in self.illegal ]
655N/A
838N/A if self.badarch:
838N/A s = _("'%s' supports the following architectures: %s")
838N/A a = _("Image architecture is defined as: %s")
1027N/A res += [ s % (self.badarch[0],
838N/A ", ".join(self.badarch[1]))]
838N/A res += [ a % (self.badarch[2])]
838N/A
1461N/A s = _("'%(p)s' depends on obsolete package '%(op)s'")
1461N/A res += [ s % {"p": p, "op": op} for p, op in self.obsolete ]
1461N/A
1352N/A if self.installed:
1352N/A s = _("The proposed operation can not be performed for "
1352N/A "the following package(s) as they are already "
1352N/A "installed: ")
1352N/A res += [s]
1352N/A res += ["\t%s" % p for p in self.installed]
1352N/A
1505N/A if self.multispec:
1505N/A s = _("The following different patterns specify the"
1505N/A "same package(s):")
1505N/A res += [s]
1505N/A for t in self.multispec:
1505N/A res += [
1505N/A ", ".join(
1505N/A [t[i] for i in range(1, len(t))])
1505N/A + ": %s" % t[0]
1945N/A ]
1505N/A if self.no_solution:
1505N/A res += [_("No solution was found to satisfy constraints")]
1505N/A
1505N/A if self.no_version:
1505N/A res += self.no_version
1505N/A
1505N/A if self.missing_dependency:
1945N/A res += [_("Package %(pkg)s is missing a dependency: "
1945N/A "%(dep)s") %
1945N/A {"pkg": self.missing_dependency[0],
1945N/A "dep": self.missing_dependency[1]}]
1945N/A
1352N/A return "\n".join(res)
565N/A
1068N/A
1050N/Aclass ActionExecutionError(ApiException):
1859N/A """Used to indicate that action execution (such as install, remove,
1859N/A etc.) failed even though the action is valid.
1050N/A
1050N/A In particular, this exception indicates that something went wrong in the
1859N/A application (or unapplication) of the action to the system, and is most
1859N/A likely not an error in the pkg(5) code."""
1859N/A
1859N/A def __init__(self, action, details=None, error=None, fmri=None,
1859N/A use_errno=None):
1859N/A """'action' is the object for the action that failed during the
1859N/A requested operation.
1859N/A
1859N/A 'details' is an optional message explaining what operation
1859N/A failed, why it failed, and why it cannot continue. It should
1859N/A also include a suggestion as to how to resolve the situation
1859N/A if possible.
1859N/A
1859N/A 'error' is an optional exception object that may have been
1859N/A raised when the operation failed.
1050N/A
1859N/A 'fmri' is an optional package FMRI indicating what package
1859N/A was being operated on at the time the error occurred.
1859N/A
1859N/A 'use_errno' is an optional boolean value indicating whether
1859N/A the strerror() text of the exception should be used. If
1859N/A 'details' is provided, the default value is False, otherwise
1859N/A True."""
1050N/A
1859N/A assert (details or error)
1050N/A self.action = action
1859N/A self.details = details
1859N/A self.error = error
1859N/A self.fmri = fmri
1859N/A if use_errno == None:
1859N/A # If details were provided, don't use errno unless
1859N/A # explicitly requested.
1859N/A use_errno = not details
1859N/A self.use_errno = use_errno
1050N/A
1050N/A def __str__(self):
1050N/A errno = ""
1859N/A if self.use_errno and self.error and \
1859N/A hasattr(self.error, "errno"):
1859N/A errno = "[errno %d: %s]" % (self.error.errno,
1859N/A os.strerror(self.error.errno))
1050N/A
1859N/A details = self.details or ""
1050N/A
1050N/A # Fall back on the wrapped exception if we don't have anything
1050N/A # useful.
1859N/A if not errno and not details:
1859N/A return str(self.error)
1859N/A
1859N/A if errno and details:
1859N/A details = "%s: %s" % (errno, details)
1050N/A
1859N/A if details and not self.fmri:
1859N/A details = _("Requested operation failed for action "
1859N/A "%(action)s:\n%(details)s") % {
1859N/A "action": self.action,
2073N/A "details": details }
1859N/A elif details:
1859N/A details = _("Requested operation failed for package "
1859N/A "%(fmri)s:\n%(details)s") % { "fmri": self.fmri,
1859N/A "details": details }
1050N/A
1050N/A # If we only have one of the two, no need for the colon.
1859N/A return "%s%s" % (errno, details)
1050N/A
1068N/A
565N/Aclass CatalogRefreshException(ApiException):
1603N/A def __init__(self, failed, total, succeeded, errmessage=None):
565N/A ApiException.__init__(self)
565N/A self.failed = failed
565N/A self.total = total
565N/A self.succeeded = succeeded
1603N/A self.errmessage = errmessage
565N/A
1068N/A
1352N/Aclass CatalogError(ApiException):
1352N/A """Base exception class for all catalog exceptions."""
1352N/A
1352N/A def __init__(self, *args, **kwargs):
565N/A ApiException.__init__(self)
1352N/A if args:
1352N/A self.data = args[0]
1352N/A else:
1352N/A self.data = None
1516N/A self._args = kwargs
1352N/A
1352N/A def __str__(self):
1352N/A return str(self.data)
1352N/A
1352N/A
1352N/Aclass AnarchicalCatalogFMRI(CatalogError):
1352N/A """Used to indicate that the specified FMRI is not valid for catalog
1352N/A operations because it is missing publisher information."""
1352N/A
1352N/A def __str__(self):
1352N/A return _("The FMRI '%s' does not contain publisher information "
1352N/A "and cannot be used for catalog operations.") % self.data
1352N/A
1352N/A
1352N/Aclass BadCatalogMetaRoot(CatalogError):
1352N/A """Used to indicate an operation on the catalog's meta_root failed
1352N/A because the meta_root is invalid."""
1352N/A
1352N/A def __str__(self):
1352N/A return _("Catalog meta_root '%(root)s' is invalid; unable "
1352N/A "to complete operation: '%(op)s'.") % { "root": self.data,
1516N/A "op": self._args.get("operation", None) }
1352N/A
1352N/A
1352N/Aclass BadCatalogPermissions(CatalogError):
1352N/A """Used to indicate the server catalog files do not have the expected
1352N/A permissions."""
1352N/A
1352N/A def __init__(self, files):
1352N/A """files should contain a list object with each entry consisting
1352N/A of a tuple of filename, expected_mode, received_mode."""
1352N/A if not files:
1352N/A files = []
1352N/A CatalogError.__init__(self, files)
1352N/A
1352N/A def __str__(self):
1352N/A msg = _("The following catalog files have incorrect "
1352N/A "permissions:\n")
1516N/A for f in self._args:
1352N/A fname, emode, fmode = f
1352N/A msg += _("\t%(fname)s: expected mode: %(emode)s, found "
1352N/A "mode: %(fmode)s\n") % { "fname": fname,
1352N/A "emode": emode, "fmode": fmode }
1352N/A return msg
1352N/A
1352N/A
1352N/Aclass BadCatalogSignatures(CatalogError):
1352N/A """Used to indicate that the Catalog signatures are not valid."""
1352N/A
1352N/A def __str__(self):
1352N/A return _("The signature data for the '%s' catalog file is not "
1352N/A "valid.") % self.data
1352N/A
1352N/A
1352N/Aclass BadCatalogUpdateIdentity(CatalogError):
1352N/A """Used to indicate that the requested catalog updates could not be
1352N/A applied as the new catalog data is significantly different such that
1352N/A the old catalog cannot be updated to match it."""
1352N/A
1352N/A def __str__(self):
1352N/A return _("Unable to determine the updates needed for "
1352N/A "the current catalog using the provided catalog "
1352N/A "update data in '%s'.") % self.data
1352N/A
1352N/A
1352N/Aclass DuplicateCatalogEntry(CatalogError):
1352N/A """Used to indicate that the specified catalog operation could not be
1352N/A performed since it would result in a duplicate catalog entry."""
1352N/A
1352N/A def __str__(self):
1352N/A return _("Unable to perform '%(op)s' operation for catalog "
1352N/A "%(name)s; completion would result in a duplicate entry "
1516N/A "for package '%(fmri)s'.") % { "op": self._args.get(
1516N/A "operation", None), "name": self._args.get("catalog_name",
1352N/A None), "fmri": self.data }
1352N/A
1352N/A
1352N/Aclass CatalogUpdateRequirements(CatalogError):
1352N/A """Used to indicate that an update request for the catalog could not
1352N/A be performed because update requirements were not satisfied."""
1352N/A
1352N/A def __str__(self):
1352N/A return _("Catalog updates can only be applied to an on-disk "
1352N/A "catalog.")
1352N/A
1352N/A
1352N/Aclass InvalidCatalogFile(CatalogError):
1352N/A """Used to indicate a Catalog file could not be loaded."""
1352N/A
1352N/A def __str__(self):
1352N/A return _("Catalog file '%s' is invalid.") % self.data
1352N/A
1352N/A
2022N/Aclass MismatchedCatalog(CatalogError):
2022N/A """Used to indicate that a Catalog's attributes and parts do not
2022N/A match. This is likely the result of an attributes file being
2022N/A retrieved which doesn't match the parts that were retrieved such
2022N/A as in a misconfigured or stale cache case."""
2022N/A
2022N/A def __str__(self):
2022N/A return _("The content of the catalog for publisher '%s' "
2022N/A "doesn't match the catalog's attributes. This is "
2022N/A "likely the result of a mix of older and newer "
2022N/A "catalog files being provided for the publisher.") % \
2022N/A self.data
2022N/A
2022N/A
1352N/Aclass ObsoleteCatalogUpdate(CatalogError):
1352N/A """Used to indicate that the specified catalog updates are for an older
1352N/A version of the catalog and cannot be applied."""
1352N/A
1352N/A def __str__(self):
1352N/A return _("Unable to determine the updates needed for the "
1352N/A "catalog using the provided catalog update data in '%s'. "
1352N/A "The specified catalog updates are for an older version "
1352N/A "of the catalog and cannot be used.") % self.data
1352N/A
1352N/A
1352N/Aclass UnknownCatalogEntry(CatalogError):
1352N/A """Used to indicate that an entry for the specified package FMRI or
1352N/A pattern could not be found in the catalog."""
1352N/A
1352N/A def __str__(self):
1352N/A return _("'%s' could not be found in the catalog.") % self.data
1352N/A
1352N/A
1352N/Aclass UnknownUpdateType(CatalogError):
1352N/A """Used to indicate that the specified CatalogUpdate operation is
1352N/A unknown."""
1352N/A
1352N/A def __str__(self):
1352N/A return _("Unknown catalog update type '%s'") % self.data
1352N/A
1352N/A
1431N/Aclass UnrecognizedCatalogPart(CatalogError):
1431N/A """Raised when the catalog finds a CatalogPart that is unrecognized
1431N/A or invalid."""
1431N/A
1431N/A def __str__(self):
1431N/A return _("Unrecognized, unknown, or invalid CatalogPart '%s'") \
1431N/A % self.data
1431N/A
1431N/A
1352N/Aclass InventoryException(ApiException):
1352N/A """Used to indicate that some of the specified patterns to a catalog
1970N/A matching function did not match any catalog entries, or were invalid
1970N/A patterns."""
1352N/A
1352N/A def __init__(self, illegal=EmptyI, matcher=EmptyI, notfound=EmptyI,
1352N/A publisher=EmptyI, version=EmptyI):
1352N/A ApiException.__init__(self)
838N/A self.illegal = illegal
1352N/A self.matcher = matcher
1352N/A self.notfound = set(notfound)
1352N/A self.publisher = publisher
1352N/A self.version = version
1352N/A
1352N/A self.notfound.update(matcher)
1352N/A self.notfound.update(publisher)
1352N/A self.notfound.update(version)
1352N/A self.notfound = list(self.notfound)
1352N/A
1945N/A assert self.illegal or self.notfound
565N/A
596N/A def __str__(self):
596N/A outstr = ""
596N/A for x in self.illegal:
596N/A # Illegal FMRIs have their own __str__ method
596N/A outstr += "%s\n" % x
614N/A
1352N/A if self.matcher or self.publisher or self.version:
614N/A outstr += _("No matching package could be found for "
614N/A "the following FMRIs in any of the catalogs for "
926N/A "the current publishers:\n")
614N/A
1352N/A for x in self.matcher:
1352N/A outstr += _("%s (pattern did not match)\n") % x
1352N/A for x in self.publisher:
1352N/A outstr += _("%s (publisher did not "
1352N/A "match)\n") % x
1352N/A for x in self.version:
1352N/A outstr += _("%s (version did not match)\n") % x
596N/A return outstr
565N/A
1027N/A
1191N/A# SearchExceptions
1191N/A
1027N/Aclass SearchException(ApiException):
1027N/A """Based class used for all search-related api exceptions."""
1027N/A pass
1027N/A
1027N/A
1191N/Aclass MalformedSearchRequest(SearchException):
1191N/A """Raised when the server cannot understand the format of the
1191N/A search request."""
1191N/A
1191N/A def __init__(self, url):
1191N/A SearchException.__init__(self)
1191N/A self.url = url
1191N/A
1191N/A def __str__(self):
1191N/A return str(self.url)
1191N/A
1191N/A
1191N/Aclass NegativeSearchResult(SearchException):
1191N/A """Returned when the search cannot find any matches."""
1191N/A
1191N/A def __init__(self, url):
1191N/A SearchException.__init__(self)
1191N/A self.url = url
1191N/A
1191N/A def __str__(self):
1191N/A return _("The search at url %s returned no results.") % self.url
1191N/A
1191N/A
1191N/Aclass ProblematicSearchServers(SearchException):
1191N/A """This class wraps exceptions which could appear while trying to
1191N/A do a search request."""
1191N/A
1191N/A def __init__(self, failed=EmptyI, invalid=EmptyI, unsupported=EmptyI):
1191N/A SearchException.__init__(self)
1191N/A self.failed_servers = failed
1191N/A self.invalid_servers = invalid
1191N/A self.unsupported_servers = unsupported
1191N/A
1191N/A def __str__(self):
1895N/A s = _("Some repositories failed to respond appropriately:\n")
1191N/A for pub, err in self.failed_servers:
1191N/A s += _("%(o)s:\n%(msg)s\n") % \
1191N/A { "o": pub, "msg": err}
1191N/A for pub in self.invalid_servers:
1191N/A s += _("%s did not return a valid response.\n" \
1191N/A % pub)
1191N/A if len(self.unsupported_servers) > 0:
1895N/A s += _("Some repositories don't support requested "
1895N/A "search operation:\n")
1191N/A for pub, err in self.unsupported_servers:
1191N/A s += _("%(o)s:\n%(msg)s\n") % \
1191N/A { "o": pub, "msg": err}
1191N/A
1191N/A return s
1191N/A
1191N/A
1191N/Aclass SlowSearchUsed(SearchException):
1191N/A """This exception is thrown when a local search is performed without
1191N/A an index. It's raised after all results have been yielded."""
1191N/A
1191N/A def __str__(self):
1191N/A return _("Search performance is degraded.\n"
1191N/A "Run 'pkg rebuild-index' to improve search speed.")
1191N/A
1191N/A
1191N/Aclass UnsupportedSearchError(SearchException):
1191N/A """Returned when a search protocol is not supported by the
1191N/A remote server."""
1191N/A
1191N/A def __init__(self, url=None, proto=None):
1191N/A SearchException.__init__(self)
1191N/A self.url = url
1191N/A self.proto = proto
1191N/A
1191N/A def __str__(self):
1895N/A s = _("Search repository does not support the requested "
1895N/A "protocol:")
1191N/A if self.url:
1895N/A s += "\nRepository URL: %s" % self.url
1191N/A if self.proto:
1191N/A s += "\nRequested operation: %s" % self.proto
1191N/A return s
1191N/A
1191N/A def __cmp__(self, other):
1191N/A if not isinstance(other, UnsupportedSearchError):
1945N/A return -1
1191N/A r = cmp(self.url, other.url)
1191N/A if r != 0:
1191N/A return r
1191N/A return cmp(self.proto, other.proto)
1191N/A
1191N/A
1191N/A# IndexingExceptions.
1191N/A
1027N/Aclass IndexingException(SearchException):
565N/A """ The base class for all exceptions that can occur while indexing. """
1027N/A
565N/A def __init__(self, private_exception):
1027N/A SearchException.__init__(self)
565N/A self.cause = private_exception.cause
565N/A
1027N/A
565N/Aclass CorruptedIndexException(IndexingException):
565N/A """This is used when the index is not in a correct state."""
565N/A pass
565N/A
1027N/A
1191N/Aclass InconsistentIndexException(IndexingException):
1191N/A """This is used when the existing index is found to have inconsistent
1191N/A versions."""
1191N/A def __init__(self, e):
1191N/A IndexingException.__init__(self, e)
1191N/A self.exception = e
1191N/A
1191N/A def __str__(self):
1191N/A return str(self.exception)
1191N/A
1191N/A
2028N/Aclass IndexLockedException(IndexingException):
2028N/A """This is used when an attempt to modify an index locked by another
2028N/A process or thread is made."""
2028N/A
2028N/A def __init__(self, e):
2028N/A IndexingException.__init__(self, e)
2028N/A self.exception = e
2028N/A
2028N/A def __str__(self):
2028N/A return str(self.exception)
2028N/A
2028N/A
565N/Aclass ProblematicPermissionsIndexException(IndexingException):
565N/A """ This is used when the indexer is unable to create, move, or remove
565N/A files or directories it should be able to. """
565N/A def __str__(self):
565N/A return "Could not remove or create " \
565N/A "%s because of incorrect " \
565N/A "permissions. Please correct this issue then " \
565N/A "rebuild the index." % self.cause
941N/A
1286N/Aclass WrapIndexingException(ApiException):
1286N/A """This exception is used to wrap an indexing exception during install,
2089N/A uninstall, or update so that a more appropriate error message can be
2089N/A displayed to the user."""
1286N/A
1286N/A def __init__(self, e, tb, stack):
1286N/A ApiException.__init__(self)
1286N/A self.wrapped = e
1286N/A self.tb = tb
1286N/A self.stack = stack
1286N/A
1286N/A def __str__(self):
1286N/A tmp = self.tb.split("\n")
1286N/A res = tmp[:1] + [s.rstrip("\n") for s in self.stack] + tmp[1:]
1286N/A return "\n".join(res)
1286N/A
1286N/A
1286N/Aclass WrapSuccessfulIndexingException(WrapIndexingException):
1286N/A """This exception is used to wrap an indexing exception during install,
2089N/A uninstall, or update which was recovered from by performing a full
2089N/A reindex."""
1286N/A pass
1286N/A
1286N/A
1191N/A# Query Parsing Exceptions
1191N/Aclass BooleanQueryException(ApiException):
1191N/A """This exception is used when the children of a boolean operation
1191N/A have different return types. The command 'pkg search foo AND <bar>'
1191N/A is the simplest example of this."""
941N/A
941N/A def __init__(self, e):
1191N/A ApiException.__init__(self)
1191N/A self.e = e
1191N/A
1191N/A def __str__(self):
1191N/A return str(self.e)
1191N/A
1191N/A
1191N/Aclass ParseError(ApiException):
1191N/A def __init__(self, e):
1191N/A ApiException.__init__(self)
941N/A self.e = e
941N/A
941N/A def __str__(self):
1027N/A return str(self.e)
1027N/A
565N/A
565N/Aclass NonLeafPackageException(ApiException):
565N/A """Removal of a package which satisfies dependencies has been attempted.
1027N/A
565N/A The first argument to the constructor is the FMRI which we tried to
565N/A remove, and is available as the "fmri" member of the exception. The
565N/A second argument is the list of dependent packages that prevent the
565N/A removal of the package, and is available as the "dependents" member.
565N/A """
565N/A
565N/A def __init__(self, *args):
565N/A ApiException.__init__(self, *args)
565N/A
565N/A self.fmri = args[0]
565N/A self.dependents = args[1]
835N/A
835N/Aclass InvalidDepotResponseException(ApiException):
835N/A """Raised when the depot doesn't have versions of operations
835N/A that the client needs to operate successfully."""
835N/A def __init__(self, url, data):
926N/A ApiException.__init__(self)
835N/A self.url = url
835N/A self.data = data
835N/A
835N/A def __str__(self):
1895N/A s = "Unable to contact valid package repository"
835N/A if self.url:
835N/A s += ": %s" % self.url
835N/A if self.data:
835N/A s += "\nEncountered the following error(s):\n%s" % \
835N/A self.data
835N/A return s
884N/A
926N/Aclass DataError(ApiException):
926N/A """Base exception class used for all data related errors."""
926N/A
926N/A def __init__(self, *args, **kwargs):
926N/A ApiException.__init__(self, *args)
926N/A if args:
926N/A self.data = args[0]
926N/A else:
926N/A self.data = None
1516N/A self._args = kwargs
926N/A
926N/A
926N/Aclass InvalidP5IFile(DataError):
926N/A """Used to indicate that the specified location does not contain a
926N/A valid p5i-formatted file."""
926N/A
926N/A def __str__(self):
926N/A if self.data:
1736N/A return _("The provided p5i data is in an unrecognized "
926N/A "format or does not contain valid publisher "
926N/A "information: %s") % self.data
1736N/A return _("The provided p5i data is in an unrecognized format "
1736N/A "or does not contain valid publisher information.")
926N/A
926N/A
926N/Aclass UnsupportedP5IFile(DataError):
926N/A """Used to indicate that an attempt to read an unsupported version
926N/A of pkg(5) info file was attempted."""
926N/A
926N/A def __str__(self):
926N/A return _("Unsupported pkg(5) publisher information data "
926N/A "format.")
926N/A
926N/A
926N/Aclass TransportError(ApiException):
1191N/A """Abstract exception class for all transport exceptions.
1191N/A Specific transport exceptions should be implemented in the
1191N/A transport code. Callers wishing to catch transport exceptions
1191N/A should use this class. Subclasses must implement all methods
1191N/A defined here that raise NotImplementedError."""
926N/A
926N/A def __str__(self):
1540N/A raise NotImplementedError()
926N/A
926N/A
1191N/Aclass RetrievalError(ApiException):
926N/A """Used to indicate that a a requested resource could not be
926N/A retrieved."""
926N/A
1191N/A def __init__(self, data, location=None):
1191N/A ApiException.__init__(self)
1191N/A self.data = data
1191N/A self.location = location
1191N/A
926N/A def __str__(self):
1191N/A if self.location:
926N/A return _("Error encountered while retrieving data from "
1191N/A "'%s':\n%s") % (self.location, self.data)
926N/A return _("Error encountered while retrieving data from: %s") % \
926N/A self.data
926N/A
926N/A
1191N/Aclass InvalidResourceLocation(ApiException):
926N/A """Used to indicate that an invalid transport location was provided."""
926N/A
1191N/A def __init__(self, data):
1191N/A ApiException.__init__(self)
1191N/A self.data = data
1191N/A
926N/A def __str__(self):
926N/A return _("'%s' is not a valid location.") % self.data
926N/A
941N/Aclass BEException(ApiException):
941N/A def __init__(self):
941N/A ApiException.__init__(self)
926N/A
884N/Aclass InvalidBENameException(BEException):
884N/A def __init__(self, be_name):
884N/A BEException.__init__(self)
884N/A self.be_name = be_name
884N/A
884N/A def __str__(self):
1076N/A return _("'%s' is not a valid boot environment name.") % \
1076N/A self.be_name
1076N/A
1076N/Aclass DuplicateBEName(BEException):
1945N/A """Used to indicate that there is an existing boot environment
1076N/A with this name"""
1076N/A
1076N/A def __init__(self, be_name):
1076N/A BEException.__init__(self)
1076N/A self.be_name = be_name
1076N/A
1076N/A def __str__(self):
1076N/A return _("The boot environment '%s' already exists.") % \
1076N/A self.be_name
884N/A
884N/Aclass BENamingNotSupported(BEException):
884N/A def __init__(self, be_name):
884N/A BEException.__init__(self)
884N/A self.be_name = be_name
884N/A
884N/A def __str__(self):
884N/A return _("""\
884N/ABoot environment naming during package install is not supported on this
2089N/Aversion of OpenSolaris. Please update without the --be-name option.""")
884N/A
884N/Aclass UnableToCopyBE(BEException):
884N/A def __str__(self):
884N/A return _("Unable to clone the current boot environment.")
884N/A
884N/Aclass UnableToRenameBE(BEException):
884N/A def __init__(self, orig, dest):
884N/A BEException.__init__(self)
884N/A self.original_name = orig
884N/A self.destination_name = dest
884N/A
884N/A def __str__(self):
884N/A d = {
884N/A "orig": self.original_name,
884N/A "dest": self.destination_name
884N/A }
884N/A return _("""\
884N/AA problem occurred while attempting to rename the boot environment
884N/Acurrently named %(orig)s to %(dest)s.""") % d
884N/A
884N/Aclass UnableToMountBE(BEException):
884N/A def __init__(self, be_name, be_dir):
884N/A BEException.__init__(self)
884N/A self.name = be_name
884N/A self.mountpoint = be_dir
884N/A
884N/A def __str__(self):
884N/A return _("Unable to mount %(name)s at %(mt)s") % \
884N/A {"name": self.name, "mt": self.mountpoint}
884N/A
884N/Aclass BENameGivenOnDeadBE(BEException):
884N/A def __init__(self, be_name):
884N/A BEException.__init__(self)
884N/A self.name = be_name
884N/A
884N/A def __str__(self):
884N/A return _("""\
884N/ANaming a boot environment when operating on a non-live image is
884N/Anot allowed.""")
926N/A
926N/A
917N/Aclass UnrecognizedOptionsToInfo(ApiException):
917N/A def __init__(self, opts):
917N/A ApiException.__init__(self)
917N/A self._opts = opts
917N/A
917N/A def __str__(self):
917N/A s = _("Info does not recognize the following options:")
917N/A for o in self._opts:
917N/A s += _(" '") + str(o) + _("'")
917N/A return s
926N/A
941N/Aclass IncorrectIndexFileHash(ApiException):
941N/A """This is used when the index hash value doesn't match the hash of the
941N/A packages installed in the image."""
941N/A pass
941N/A
941N/A
926N/Aclass PublisherError(ApiException):
926N/A """Base exception class for all publisher exceptions."""
926N/A
926N/A def __init__(self, *args, **kwargs):
926N/A ApiException.__init__(self, *args)
926N/A if args:
926N/A self.data = args[0]
926N/A else:
926N/A self.data = None
1516N/A self._args = kwargs
926N/A
926N/A def __str__(self):
926N/A return str(self.data)
926N/A
926N/A
1087N/Aclass BadPublisherMetaRoot(PublisherError):
1087N/A """Used to indicate an operation on the publisher's meta_root failed
1087N/A because the meta_root is invalid."""
1087N/A
1087N/A def __str__(self):
1087N/A return _("Publisher meta_root '%(root)s' is invalid; unable "
1087N/A "to complete operation: '%(op)s'.") % { "root": self.data,
1516N/A "op": self._args.get("operation", None) }
1087N/A
1087N/A
2028N/Aclass BadPublisherAlias(PublisherError):
2028N/A """Used to indicate that a publisher alias is not valid."""
2028N/A
2028N/A def __str__(self):
2028N/A return _("'%s' is not a valid publisher alias.") % self.data
2028N/A
2028N/A
926N/Aclass BadPublisherPrefix(PublisherError):
926N/A """Used to indicate that a publisher name is not valid."""
926N/A
926N/A def __str__(self):
926N/A return _("'%s' is not a valid publisher name.") % self.data
926N/A
926N/A
926N/Aclass BadRepositoryAttributeValue(PublisherError):
926N/A """Used to indicate that the specified repository attribute value is
926N/A invalid."""
926N/A
926N/A def __str__(self):
926N/A return _("'%(value)s' is not a valid value for repository "
926N/A "attribute '%(attribute)s'.") % {
1516N/A "value": self._args["value"], "attribute": self.data }
926N/A
926N/A
926N/Aclass BadRepositoryCollectionType(PublisherError):
926N/A """Used to indicate that the specified repository collection type is
926N/A invalid."""
926N/A
926N/A def __init__(self, *args, **kwargs):
926N/A PublisherError.__init__(self, *args, **kwargs)
926N/A
926N/A def __str__(self):
926N/A return _("'%s' is not a valid repository collection type.") % \
926N/A self.data
926N/A
926N/A
926N/Aclass BadRepositoryURI(PublisherError):
926N/A """Used to indicate that a repository URI is not syntactically valid."""
926N/A
926N/A def __str__(self):
926N/A return _("'%s' is not a valid URI.") % self.data
926N/A
926N/A
926N/Aclass BadRepositoryURIPriority(PublisherError):
926N/A """Used to indicate that the priority specified for a repository URI is
926N/A not valid."""
926N/A
926N/A def __str__(self):
926N/A return _("'%s' is not a valid URI priority; integer value "
926N/A "expected.") % self.data
926N/A
926N/A
926N/Aclass BadRepositoryURISortPolicy(PublisherError):
926N/A """Used to indicate that the specified repository URI sort policy is
926N/A invalid."""
926N/A
926N/A def __init__(self, *args, **kwargs):
926N/A PublisherError.__init__(self, *args, **kwargs)
926N/A
926N/A def __str__(self):
926N/A return _("'%s' is not a valid repository URI sort policy.") % \
926N/A self.data
926N/A
926N/A
926N/Aclass DisabledPublisher(PublisherError):
926N/A """Used to indicate that an attempt to use a disabled publisher occurred
926N/A during an operation."""
926N/A
926N/A def __str__(self):
926N/A return _("Publisher '%s' is disabled and cannot be used for "
926N/A "packaging operations.") % self.data
926N/A
926N/A
926N/Aclass DuplicatePublisher(PublisherError):
926N/A """Used to indicate that a publisher with the same name or alias already
926N/A exists for an image."""
926N/A
926N/A def __str__(self):
926N/A return _("A publisher with the same name or alias as '%s' "
926N/A "already exists.") % self.data
926N/A
926N/A
926N/Aclass DuplicateRepository(PublisherError):
926N/A """Used to indicate that a repository with the same origin uris
926N/A already exists for a publisher."""
926N/A
926N/A def __str__(self):
926N/A return _("A repository with the same name or origin URIs "
926N/A "already exists for publisher '%s'.") % self.data
926N/A
926N/A
926N/Aclass DuplicateRepositoryMirror(PublisherError):
926N/A """Used to indicate that a repository URI is already in use by another
926N/A repository mirror."""
926N/A
926N/A def __str__(self):
926N/A return _("Mirror '%s' already exists for the specified "
1504N/A "publisher.") % self.data
926N/A
926N/A
926N/Aclass DuplicateRepositoryOrigin(PublisherError):
926N/A """Used to indicate that a repository URI is already in use by another
926N/A repository origin."""
926N/A
926N/A def __str__(self):
926N/A return _("Origin '%s' already exists for the specified "
1504N/A "publisher.") % self.data
1504N/A
1504N/A
1504N/Aclass PublisherOriginRequired(PublisherError):
1504N/A """Used to indicate that the specified publisher must have at least one
1504N/A repository with at least one origin URI."""
1504N/A
1504N/A def __str__(self):
1504N/A return _("At least one origin is required for %s. You must "
1504N/A "add a new origin before attempting to remove the specified "
1504N/A "origin(s).") % self.data
926N/A
926N/A
926N/Aclass RemovePreferredPublisher(PublisherError):
926N/A """Used to indicate an attempt to remove the preferred publisher was
926N/A made."""
926N/A
926N/A def __str__(self):
926N/A return _("The preferred publisher cannot be removed.")
926N/A
926N/A
1505N/Aclass MoveRelativeToSelf(PublisherError):
1505N/A """Used to indicate an attempt to search a repo before or after itself"""
1505N/A
1505N/A def __str__(self):
1505N/A return _("Cannot search a repository before or after itself")
1505N/A
1505N/A
926N/Aclass SelectedRepositoryRemoval(PublisherError):
926N/A """Used to indicate that an attempt to remove the selected repository
926N/A for a publisher was made."""
926N/A
926N/A def __str__(self):
926N/A return _("Cannot remove the selected repository for a "
926N/A "publisher.")
926N/A
926N/A
1256N/Aclass SetDisabledPublisherPreferred(PublisherError):
926N/A """Used to indicate an attempt to set a disabled publisher as the
926N/A preferred publisher was made."""
926N/A
926N/A def __str__(self):
996N/A return _("Publisher '%s' is disabled and cannot be set as the "
996N/A "preferred publisher.") % self.data
926N/A
926N/A
1256N/Aclass SetPreferredPublisherDisabled(PublisherError):
1256N/A """Used to indicate that an attempt was made to set the preferred
1256N/A publisher as disabled."""
1256N/A
1256N/A def __str__(self):
1256N/A return _("The preferred publisher may not be disabled."
1256N/A " Another publisher must be set as the preferred "
1256N/A "publisher before this publisher can be disabled.")
1256N/A
1256N/A
926N/Aclass UnknownLegalURI(PublisherError):
926N/A """Used to indicate that no matching legal URI could be found using the
926N/A provided criteria."""
926N/A
926N/A def __str__(self):
926N/A return _("Unknown legal URI '%s'.") % self.data
926N/A
926N/A
926N/Aclass UnknownPublisher(PublisherError):
926N/A """Used to indicate that no matching publisher could be found using the
926N/A provided criteria."""
926N/A
926N/A def __str__(self):
926N/A return _("Unknown publisher '%s'.") % self.data
926N/A
926N/A
1736N/Aclass UnknownRepositoryPublishers(PublisherError):
1736N/A """Used to indicate that one or more publisher prefixes are unknown by
1736N/A the specified repository."""
1736N/A
1736N/A def __init__(self, known=EmptyI, unknown=EmptyI, location=None,
1736N/A origins=EmptyI):
1736N/A ApiException.__init__(self)
1736N/A self.known = known
1736N/A self.location = location
1736N/A self.origins = origins
1736N/A self.unknown = unknown
1736N/A
1736N/A def __str__(self):
1736N/A if self.location:
1736N/A return _("The repository at %(location)s does not "
1736N/A "contain package data for %(unknown)s; only "
1736N/A "%(known)s.\n\nThis is either because the "
1736N/A "repository location is not valid, or because the "
1736N/A "provided publisher does not match those known by "
1736N/A "the repository.") % {
1736N/A "unknown": ", ".join(self.unknown),
1736N/A "location": self.location,
1736N/A "known": ", ".join(self.known) }
1736N/A if self.origins:
1736N/A return _("One or more of the repository origin(s) "
1736N/A "listed below contains package data for "
1736N/A "%(known)s; not %(unknown)s:\n\n%(origins)s\n\n"
1736N/A "This is either because one of the repository "
1736N/A "origins is not valid for this publisher, or "
1736N/A "because the list of known publishers retrieved "
1736N/A "from the repository origin does not match the "
1736N/A "client.") % { "unknown": ", ".join(self.unknown),
1736N/A "known": ", ".join(self.known),
1736N/A "origins": "\n".join(str(o) for o in self.origins) }
1736N/A return _("The specified publisher repository does not "
1736N/A "contain any package data for %(unknown)s; only "
1736N/A "%(known)s.") % { "unknown": ", ".join(self.unknown),
1736N/A "known": ", ".join(self.known) }
1736N/A
1736N/A
926N/Aclass UnknownRelatedURI(PublisherError):
926N/A """Used to indicate that no matching related URI could be found using
926N/A the provided criteria."""
926N/A
926N/A def __str__(self):
926N/A return _("Unknown related URI '%s'.") % self.data
926N/A
926N/A
926N/Aclass UnknownRepository(PublisherError):
926N/A """Used to indicate that no matching repository could be found using the
926N/A provided criteria."""
926N/A
926N/A def __str__(self):
926N/A return _("Unknown repository '%s'.") % self.data
926N/A
926N/A
926N/Aclass UnknownRepositoryMirror(PublisherError):
926N/A """Used to indicate that a repository URI could not be found in the
926N/A list of repository mirrors."""
926N/A
926N/A def __str__(self):
926N/A return _("Unknown repository mirror '%s'.") % self.data
926N/A
1431N/Aclass UnsupportedRepositoryOperation(PublisherError):
1431N/A """The publisher has no active repositories that support the
1431N/A requested operation."""
1431N/A
1431N/A def __init__(self, pub, operation):
1431N/A ApiException.__init__(self)
1431N/A self.data = None
1431N/A self.kwargs = None
1431N/A self.pub = pub
1431N/A self.op = operation
1431N/A
1431N/A def __str__(self):
1431N/A return _("Publisher '%s' has no repositories that support the"
1736N/A " '%s' operation.") % (self.pub, self.op)
1736N/A
1937N/Aclass UnsupportedSystemRepositoryOperation(PublisherError):
1937N/A """Operating on the SystemRepository using this method is not
1937N/A supported."""
1937N/A
1937N/A def __str__(self):
1937N/A return _("Can not modify system repository using "
1937N/A "method '%s'.") % self.data
1937N/A
1937N/Aclass UnsupportedSystemRepositoryProtocol(PublisherError):
1937N/A """The caller tried to configure a System Repository with a
1937N/A protocol that is not supported."""
1937N/A
1937N/A def __str__(self):
1937N/A return _("System repository does not support "
1937N/A "protocol '%s'.") % self.data
1736N/A
1736N/Aclass RepoPubConfigUnavailable(PublisherError):
1736N/A """Used to indicate that the specified repository does not provide
1736N/A publisher configuration information."""
1736N/A
1736N/A def __init__(self, location=None, pub=None):
1736N/A ApiException.__init__(self)
1736N/A self.location = location
1736N/A self.pub = pub
1736N/A
1736N/A def __str__(self):
1736N/A if not self.location and not self.pub:
1736N/A return _("The specified package repository does not "
1736N/A "provide publisher configuration information.")
1736N/A if self.location:
1736N/A return _("The package repository at %s does not "
1736N/A "provide publisher configuration information or "
1736N/A "the information provided is incomplete.") % \
1736N/A self.location
1736N/A return _("One of the package repository origins for %s does "
1736N/A "not provide publisher configuration information or the "
1736N/A "information provided is incomplete.") % self.pub
1736N/A
926N/A
926N/Aclass UnknownRepositoryOrigin(PublisherError):
926N/A """Used to indicate that a repository URI could not be found in the
926N/A list of repository origins."""
926N/A
926N/A def __str__(self):
926N/A return _("Unknown repository origin '%s'") % self.data
926N/A
926N/A
926N/Aclass UnsupportedRepositoryURI(PublisherError):
926N/A """Used to indicate that the specified repository URI uses an
926N/A unsupported scheme."""
926N/A
926N/A def __str__(self):
926N/A if self.data:
926N/A scheme = urlparse.urlsplit(self.data,
926N/A allow_fragments=0)[0]
926N/A return _("The URI '%(uri)s' contains an unsupported "
926N/A "scheme '%(scheme)s'.") % { "uri": self.data,
926N/A "scheme": scheme }
926N/A return _("The specified URI contains an unsupported scheme.")
926N/A
926N/A
926N/Aclass UnsupportedRepositoryURIAttribute(PublisherError):
926N/A """Used to indicate that the specified repository URI attribute is not
926N/A supported for the URI's scheme."""
926N/A
926N/A def __str__(self):
926N/A return _("'%(attr)s' is not supported for '%(scheme)s'.") % {
1516N/A "attr": self.data, "scheme": self._args["scheme"] }
926N/A
926N/A
2026N/Aclass SigningException(ApiException):
2026N/A """The base class for exceptions related to manifest signing."""
2026N/A
2026N/A def __init__(self, pfmri=None, sig=None):
2026N/A self.pfmri = pfmri
2026N/A self.sig = sig
2026N/A
2026N/A # This string method is used by subclasses to fill in the details
2026N/A # about the package and signature involved.
2026N/A def __str__(self):
2026N/A if self.pfmri:
2026N/A if self.sig:
2026N/A return _("The relevant signature action is "
2026N/A "found in %(pfmri)s and has a hash of "
2026N/A "%(hsh)s") % \
2026N/A {"pfmri": self.pfmri, "hsh": self.sig.hash}
2026N/A return _("The package involved is:%s") % self.pfmri
2026N/A if self.sig:
2026N/A return _("The relevant signature action's value "
2026N/A "attribute is %s") % self.sig.attrs["value"]
2026N/A return ""
2026N/A
2026N/A
2026N/Aclass BadFileFormat(SigningException):
2026N/A """Exception used when a key, certificate or CRL file is not in a
2026N/A recognized format."""
2026N/A
2026N/A def __init__(self, txt):
2026N/A self.txt = txt
2026N/A
2026N/A def __str__(self):
2026N/A return self.txt
2026N/A
2026N/A
2026N/Aclass UnsupportedSignatureVersion(SigningException):
2026N/A """Exception used when a signature reports a version which this version
2026N/A of pkg(5) doesn't support."""
2026N/A
2026N/A def __init__(self, version, *args, **kwargs):
2026N/A SigningException.__init__(self, *args, **kwargs)
2026N/A self.version = version
2026N/A
2026N/A def __str__(self):
2026N/A return _("The signature action %(act)s was made using a "
2026N/A "version (%(ver)s) this version of pkg(5) doesn't "
2026N/A "understand.") % {"act":self.sig, "ver":self.version}
2026N/A
2026N/A
2026N/Aclass CertificateException(SigningException):
2026N/A """Base class for exceptions encountered while establishing the chain
2026N/A of trust."""
2026N/A
2026N/A def __init__(self, cert, pfmri=None):
2026N/A SigningException.__init__(self, pfmri)
2026N/A self.cert = cert
2026N/A
2026N/A
2026N/Aclass ModifiedCertificateException(CertificateException):
2026N/A """Exception used when a certificate does not match its expected hash
2026N/A value."""
2026N/A
2026N/A def __init__(self, cert, path, pfmri=None):
2026N/A CertificateException.__init__(self, cert, pfmri)
2026N/A self.path = path
2026N/A
2026N/A def __str__(self):
2026N/A return _("Certificate %s has been modified on disk. Its hash "
2026N/A "value is not what was expected.") % self.path
2026N/A
2026N/A
2026N/Aclass UntrustedSelfSignedCert(CertificateException):
2026N/A """Exception used when a chain of trust is rooted in an untrusted
2026N/A self-signed certificate."""
2026N/A
2026N/A def __str__(self):
2026N/A return _("Chain was rooted in an untrusted self-signed "
2026N/A "certificate.\n") + CertificateException.__str__(self)
2026N/A
2026N/A
2026N/Aclass BrokenChain(CertificateException):
2026N/A """Exception used when a chain of trust can not be established between
2026N/A the leaf certificate and a trust anchor."""
2026N/A
2026N/A def __init__(self, cert, cert_exceptions, *args, **kwargs):
2026N/A CertificateException.__init__(self, cert, *args, **kwargs)
2026N/A self.ext_exs = cert_exceptions
2026N/A
2026N/A def __str__(self):
2026N/A s = ""
2026N/A if self.ext_exs:
2026N/A s = _("The following problems were encountered:\n") + \
2026N/A "\n".join([str(e) for e in self.ext_exs])
2026N/A return _("The certificate which issued this "
2026N/A "certificate:%(subj)s could not be found. The issuer "
2026N/A "is:%(issuer)s\n") % {"subj":self.cert.get_subject(),
2026N/A "issuer":self.cert.get_issuer()} + s + \
2026N/A CertificateException.__str__(self)
2026N/A
2026N/A
2026N/Aclass RevokedCertificate(CertificateException):
2026N/A """Exception used when a chain of trust contains a revoked certificate.
2026N/A """
2026N/A
2026N/A def __init__(self, cert, reason, *args, **kwargs):
2026N/A CertificateException.__init__(self, cert, *args, **kwargs)
2026N/A self.reason = reason
2026N/A
2026N/A def __str__(self):
2026N/A return _("This certificate was revoked:%(cert)s for this "
2026N/A "reason:\n%(reason)s") % {"cert":self.cert.get_subject(),
2026N/A "reason":self.reason} + CertificateException.__str__(self)
2026N/A
2026N/A
2026N/Aclass UnverifiedSignature(SigningException):
2026N/A """Exception used when a signature could not be verified by the
2026N/A expected certificate."""
2026N/A
2026N/A def __init__(self, sig, reason, pfmri=None):
2026N/A SigningException.__init__(self, pfmri)
2026N/A self.sig = sig
2026N/A self.reason = reason
2026N/A
2026N/A def __str__(self):
2026N/A if self.pfmri:
2026N/A return _("A signature in %(pfmri)s could not be "
2026N/A "verified for "
2026N/A "this reason:\n%(reason)s\nThe signature's hash is "
2026N/A "%(hash)s") % {"pfmri": self.pfmri,
2026N/A "reason": self.reason,
2026N/A "hash": self.sig.hash}
2026N/A return _("The signature with this signature value:\n"
2026N/A "%(sigval)s\n could not be verified for this reason:\n"
2026N/A "%(reason)s\n") % {"reason": self.reason,
2026N/A "sigval": self.sig.attrs["value"]}
2026N/A
2026N/A
2026N/Aclass RequiredSignaturePolicyException(SigningException):
2026N/A """Exception used when signatures were required but none were found."""
2026N/A
2026N/A def __init__(self, pub, pfmri=None):
2026N/A SigningException.__init__(self, pfmri)
2026N/A self.pub = pub
2026N/A
2026N/A def __str__(self):
2026N/A pub_str = self.pub.prefix
2026N/A if self.pfmri:
2026N/A return _("The policy for %(pub_str)s requires "
2026N/A "signatures to be present but no signature was "
2026N/A "found in %(fmri_str)s.") % \
2026N/A {"pub_str": pub_str, "fmri_str": self.pfmri}
2026N/A return _("The policy for %(pub_str)s requires signatures to be "
2026N/A "present but no signature was found.") % {
2026N/A "pub_str": pub_str}
2026N/A
2026N/A
2026N/Aclass MissingRequiredNamesException(SigningException):
2026N/A """Exception used when a signature policy required names to be seen
2026N/A which weren't seen."""
2026N/A
2026N/A def __init__(self, pub, missing_names, pfmri=None):
2026N/A SigningException.__init__(self, pfmri)
2026N/A self.pub = pub
2026N/A self.missing_names = missing_names
2026N/A
2026N/A def __str__(self):
2026N/A pub_str = self.pub.prefix
2026N/A if self.pfmri:
2026N/A return _("The policy for %(pub_str)s requires certain "
2026N/A "CNs to be seen in a chain of trust. The following "
2026N/A "required names couldn't be found for this "
2026N/A "package:%(fmri_str)s.\n%(missing)s") % \
2026N/A {"pub_str": pub_str, "fmri_str": self.pfmri,
2026N/A "missing": "\n".join(self.missing_names)}
2026N/A return _("The policy for %(pub_str)s requires certain CNs to "
2026N/A "be seen in a chain of trust. The following required names "
2026N/A "couldn't be found.\n%(missing)s") % {"pub_str": pub_str,
2026N/A "missing": "\n".join(self.missing_names)}
2026N/A
2026N/Aclass UnsupportedCriticalExtension(SigningException):
2026N/A """Exception used when a certificate in the chain of trust uses a
2026N/A critical extension pkg5 doesn't understand."""
2026N/A
2026N/A def __init__(self, cert, ext):
2026N/A SigningException.__init__(self)
2026N/A self.cert = cert
2026N/A self.ext = ext
2026N/A
2026N/A def __str__(self):
2026N/A return _("The certificate whose subject is %(cert)s could not "
2026N/A "be verified "
2026N/A "because it uses a critical extension that pkg5 cannot "
2026N/A "handle yet.\nExtension name:%(name)s\nExtension "
2026N/A "value:%(val)s") % {"cert": self.cert.get_subject(),
2026N/A "name":self.ext.get_name(), "val":self.ext.get_value()}
2026N/A
2026N/A
2026N/Aclass InvalidPropertyValue(ApiException):
2026N/A """Exception used when a property was set to an invalid value."""
2026N/A
2026N/A def __init__(self, s):
2026N/A ApiException.__init__(self)
2026N/A self.str = s
2026N/A
2026N/A def __str__(self):
2026N/A return self.str
2026N/A
2026N/A
926N/Aclass CertificateError(ApiException):
926N/A """Base exception class for all certificate exceptions."""
926N/A
926N/A def __init__(self, *args, **kwargs):
926N/A ApiException.__init__(self, *args)
926N/A if args:
926N/A self.data = args[0]
926N/A else:
926N/A self.data = None
1516N/A self._args = kwargs
926N/A
926N/A def __str__(self):
926N/A return str(self.data)
926N/A
926N/A
926N/Aclass ExpiredCertificate(CertificateError):
926N/A """Used to indicate that a certificate has expired."""
926N/A
926N/A def __str__(self):
1516N/A publisher = self._args.get("publisher", None)
1516N/A uri = self._args.get("uri", None)
926N/A if publisher:
926N/A if uri:
926N/A return _("Certificate '%(cert)s' for publisher "
926N/A "'%(pub)s' needed to access '%(uri)s', "
926N/A "has expired. Please install a valid "
926N/A "certificate.") % { "cert": self.data,
1130N/A "pub": publisher, "uri": uri }
926N/A return _("Certificate '%(cert)s' for publisher "
926N/A "'%(pub)s', has expired. Please install a valid "
926N/A "certificate.") % { "cert": self.data,
926N/A "pub": publisher }
926N/A if uri:
926N/A return _("Certificate '%(cert)s', needed to access "
926N/A "'%(uri)s', has expired. Please install a valid "
926N/A "certificate.") % { "cert": self.data, "uri": uri }
926N/A return _("Certificate '%s' has expired. Please install a "
926N/A "valid certificate.") % self.data
926N/A
926N/A
926N/Aclass ExpiringCertificate(CertificateError):
926N/A """Used to indicate that a certificate has expired."""
926N/A
926N/A def __str__(self):
1516N/A publisher = self._args.get("publisher", None)
1516N/A uri = self._args.get("uri", None)
1516N/A days = self._args.get("days", 0)
926N/A if publisher:
926N/A if uri:
926N/A return _("Certificate '%(cert)s' for publisher "
926N/A "'%(pub)s', needed to access '%(uri)s', "
926N/A "will expire in '%(days)s' days.") % {
926N/A "cert": self.data, "pub": publisher,
926N/A "uri": uri, "days": days }
926N/A return _("Certificate '%(cert)s' for publisher "
926N/A "'%(pub)s' will expire in '%(days)s' days.") % {
926N/A "cert": self.data, "pub": publisher, "days": days }
926N/A if uri:
926N/A return _("Certificate '%(cert)s', needed to access "
926N/A "'%(uri)s', will expire in '%(days)s' days.") % {
926N/A "cert": self.data, "uri": uri, "days": days }
926N/A return _("Certificate '%(cert)s' will expire in "
926N/A "'%(days)s' days.") % { "cert": self.data, "days": days }
926N/A
926N/A
926N/Aclass InvalidCertificate(CertificateError):
926N/A """Used to indicate that a certificate is invalid."""
926N/A
926N/A def __str__(self):
1516N/A publisher = self._args.get("publisher", None)
1516N/A uri = self._args.get("uri", None)
926N/A if publisher:
926N/A if uri:
926N/A return _("Certificate '%(cert)s' for publisher "
926N/A "'%(pub)s', needed to access '%(uri)s', is "
926N/A "invalid.") % { "cert": self.data,
926N/A "pub": publisher, "uri": uri }
926N/A return _("Certificate '%(cert)s' for publisher "
926N/A "'%(pub)s' is invalid.") % { "cert": self.data,
926N/A "pub": publisher }
926N/A if uri:
926N/A return _("Certificate '%(cert)s' needed to access "
926N/A "'%(uri)s' is invalid.") % { "cert": self.data,
926N/A "uri": uri }
926N/A return _("Invalid certificate '%s'.") % self.data
926N/A
926N/A
1254N/Aclass NoSuchKey(CertificateError):
1254N/A """Used to indicate that a key could not be found."""
1254N/A
1254N/A def __str__(self):
1516N/A publisher = self._args.get("publisher", None)
1516N/A uri = self._args.get("uri", None)
1254N/A if publisher:
1254N/A if uri:
1254N/A return _("Unable to locate key '%(key)s' for "
1254N/A "publisher '%(pub)s' needed to access "
1254N/A "'%(uri)s'.") % { "key": self.data,
1254N/A "pub": publisher, "uri": uri }
1254N/A return _("Unable to locate key '%(key)s' for publisher "
1254N/A "'%(pub)s'.") % { "key": self.data, "pub": publisher
1254N/A }
1254N/A if uri:
1254N/A return _("Unable to locate key '%(key)s' needed to "
1254N/A "access '%(uri)s'.") % { "key": self.data,
1254N/A "uri": uri }
1254N/A return _("Unable to locate key '%s'.") % self.data
1254N/A
1254N/A
926N/Aclass NoSuchCertificate(CertificateError):
926N/A """Used to indicate that a certificate could not be found."""
926N/A
926N/A def __str__(self):
1516N/A publisher = self._args.get("publisher", None)
1516N/A uri = self._args.get("uri", None)
926N/A if publisher:
926N/A if uri:
926N/A return _("Unable to locate certificate "
926N/A "'%(cert)s' for publisher '%(pub)s' needed "
926N/A "to access '%(uri)s'.") % {
926N/A "cert": self.data, "pub": publisher,
926N/A "uri": uri }
926N/A return _("Unable to locate certificate '%(cert)s' for "
926N/A "publisher '%(pub)s'.") % { "cert": self.data,
926N/A "pub": publisher }
926N/A if uri:
926N/A return _("Unable to locate certificate '%(cert)s' "
926N/A "needed to access '%(uri)s'.") % {
926N/A "cert": self.data, "uri": uri }
926N/A return _("Unable to locate certificate '%s'.") % self.data
926N/A
926N/A
926N/Aclass NotYetValidCertificate(CertificateError):
926N/A """Used to indicate that a certificate is not yet valid (future
926N/A effective date)."""
926N/A
926N/A def __str__(self):
1516N/A publisher = self._args.get("publisher", None)
1516N/A uri = self._args.get("uri", None)
926N/A if publisher:
926N/A if uri:
926N/A return _("Certificate '%(cert)s' for publisher "
926N/A "'%(pub)s', needed to access '%(uri)s', "
926N/A "has a future effective date.") % {
926N/A "cert": self.data, "pub": publisher,
926N/A "uri": uri }
926N/A return _("Certificate '%(cert)s' for publisher "
926N/A "'%(pub)s' has a future effective date.") % {
926N/A "cert": self.data, "pub": publisher }
926N/A if uri:
926N/A return _("Certificate '%(cert)s' needed to access "
926N/A "'%(uri)s' has a future effective date.") % {
926N/A "cert": self.data, "uri": uri }
926N/A return _("Certificate '%s' has a future effective date.") % \
926N/A self.data
941N/A
941N/A
941N/Aclass ServerReturnError(ApiException):
2028N/A """This exception is used when the server returns a line which the
1100N/A client cannot parse correctly."""
1100N/A
941N/A def __init__(self, line):
941N/A ApiException.__init__(self)
941N/A self.line = line
941N/A
941N/A def __str__(self):
1027N/A return _("Gave a bad response:%s") % self.line
1337N/A
1352N/A
1337N/Aclass MissingFileArgumentException(ApiException):
1337N/A """This exception is used when a file was given as an argument but
1337N/A no such file could be found."""
1337N/A def __init__(self, path):
1337N/A ApiException.__init__(self)
1337N/A self.path = path
1337N/A
1337N/A def __str__(self):
1337N/A return _("Could not find %s") % self.path
1352N/A
1352N/A
1352N/Aclass ManifestError(ApiException):
1352N/A """Base exception class for all manifest exceptions."""
1352N/A
1352N/A def __init__(self, *args, **kwargs):
1352N/A ApiException.__init__(self, *args, **kwargs)
1352N/A if args:
1352N/A self.data = args[0]
1352N/A else:
1352N/A self.data = None
1516N/A self._args = kwargs
1352N/A
1352N/A def __str__(self):
1352N/A return str(self.data)
1352N/A
1352N/A
1352N/Aclass BadManifestSignatures(ManifestError):
1352N/A """Used to indicate that the Manifest signatures are not valid."""
1352N/A
1352N/A def __str__(self):
1352N/A if self.data:
1352N/A return _("The signature data for the manifest of the "
1352N/A "'%s' package is not valid.") % self.data
1352N/A return _("The signature data for the manifest is not valid.")
1370N/A
1736N/A
1736N/Aclass UnknownErrors(ApiException):
1736N/A """Used to indicate that one or more exceptions were encountered.
1736N/A This is intended for use with where multiple exceptions for multiple
1736N/A files are encountered and the errors have been condensed into a
1736N/A single exception and re-raised. One example case would be rmtree()
1736N/A with shutil.Error."""
1736N/A
1736N/A def __init__(self, msg):
1736N/A ApiException.__init__(self)
1736N/A self.__msg = msg
1736N/A
1736N/A def __str__(self):
1736N/A return self.__msg
1736N/A
1736N/A
1370N/A# Image creation exceptions
1370N/Aclass ImageCreationException(ApiException):
1370N/A def __init__(self, path):
1736N/A ApiException.__init__(self)
1370N/A self.path = path
1370N/A
1370N/A def __str__(self):
1370N/A raise NotImplementedError()
1370N/A
1370N/A
1370N/Aclass ImageAlreadyExists(ImageCreationException):
1370N/A def __str__(self):
1370N/A return _("there is already an image at: %s.\nTo override, use "
1370N/A "the -f (force) option.") % self.path
1370N/A
1370N/A
2097N/Aclass ImageCfgEmptyError(ApiException):
2097N/A """Used to indicate that the image configuration is invalid."""
2097N/A
2097N/A def __str__(self):
2097N/A return _("The configuration data for the image located at "
2097N/A "'%s' is empty or missing.") % self.data
2097N/A
2097N/A
1370N/Aclass CreatingImageInNonEmptyDir(ImageCreationException):
1370N/A def __str__(self):
1370N/A return _("the specified image path is not empty: %s.\nTo "
1370N/A "override, use the -f (force) option.") % self.path
2026N/A
2026N/A
2073N/Adef _convert_error(e, ignored_errors=EmptyI):
2073N/A """Converts the provided exception into an ApiException equivalent if
2073N/A possible. Returns a new exception object if converted or the original
2073N/A if not.
2073N/A
2073N/A 'ignored_errors' is an optional list of errno values for which None
2073N/A should be returned.
2073N/A """
2073N/A
2073N/A if not hasattr(e, "errno"):
2073N/A return e
2026N/A if e.errno in ignored_errors:
2026N/A return None
2026N/A if e.errno in (errno.EACCES, errno.EPERM):
2026N/A return PermissionsException(e.filename)
2026N/A if e.errno == errno.EROFS:
2026N/A return ReadOnlyFileSystemException(e.filename)
2026N/A return e