~ubuntu-branches/debian/squeeze/aptdaemon/squeeze

« back to all changes in this revision

Viewing changes to aptdaemon/errors.py

  • Committer: Bazaar Package Importer
  • Author(s): Julian Andres Klode
  • Date: 2010-06-06 14:30:27 UTC
  • mfrom: (1.1.18 upstream) (18.1.12 maverick)
  • Revision ID: james.westby@ubuntu.com-20100606143027-tyttr56a1y7lk2h6
Tags: 0.31+bzr413-1
* Merge with Ubuntu, remaining differences:
  - debian/copyright uses DEP-5 format.
  - debian/source/format: Set to "3.0 (quilt)".
  - debian/rules: Use debhelper 7 instead of quilt
  - debian/watch: Added watch file.
  - debian/control: Reindent, Vcs, Maintainer changes.
* debian/patches/03_auth_me_less.patch: Change patch level to 1.

Show diffs side-by-side

added added

removed removed

Lines of Context:
19
19
 
20
20
__author__  = "Sebastian Heinlein <devel@glatzor.de>"
21
21
 
 
22
__all__ = ("AptDaemonError", "ForeignTransaction", "InvalidMetaDataError",
 
23
           "InvalidProxyError", "RepositoryInvalidError",
 
24
           "TransactionAlreadyRunning", "TransactionCancelled",
 
25
           "TransactionFailed", "TransactionRoleAlreadySet",
 
26
           "NotAuthorizedError", "convert_dbus_exception",
 
27
           "get_native_exception")
 
28
 
 
29
import inspect
22
30
import dbus
23
 
 
24
 
class APTDError(dbus.DBusException):
 
31
from functools import wraps
 
32
 
 
33
 
 
34
class AptDaemonError(dbus.DBusException):
 
35
 
25
36
    """Internal error of the aptdaemon"""
 
37
 
26
38
    _dbus_error_name = "org.debian.apt"
27
39
 
28
 
class TransactionRoleAlreadySet(APTDError):
 
40
 
 
41
class TransactionRoleAlreadySet(AptDaemonError):
 
42
 
29
43
    """Error if a transaction has already been configured."""
 
44
 
30
45
    _dbus_error_name = "org.debian.apt.TransactionRoleAlreadySet"
31
46
 
32
 
class TransactionAlreadyRunning(APTDError):
 
47
 
 
48
class TransactionAlreadyRunning(AptDaemonError):
 
49
 
33
50
    """Error if a transaction has already been configured."""
 
51
 
34
52
    _dbus_error_name = "org.debian.apt.TransactionAlreadyRunning"
35
53
 
36
 
class ForeignTransaction(APTDError):
 
54
 
 
55
class ForeignTransaction(AptDaemonError):
 
56
 
37
57
    """Error if a transaction was initialized by a different user."""
 
58
 
38
59
    _dbus_error_name = "org.debian.apt.TransactionAlreadyRunning"
39
60
 
40
 
class TransactionFailed(APTDError):
 
61
 
 
62
class TransactionFailed(AptDaemonError):
 
63
 
41
64
    """Internal error if a transaction could not be processed successfully."""
 
65
 
42
66
    _dbus_error_name = "org.debian.apt.TransactionFailed"
43
 
    def __init__(self, enum, msg=""):
44
 
        APTDError.__init__(self)
45
 
        self.enum = enum
46
 
        self.message = msg
47
 
 
48
 
class InvalidMetaDataError(APTDError):
 
67
 
 
68
    def __init__(self, code, details=""):
 
69
        AptDaemonError.__init__(self, "%s: %s" % (code, details))
 
70
        self.code = code
 
71
        self.details = details
 
72
 
 
73
 
 
74
class InvalidMetaDataError(AptDaemonError):
 
75
 
49
76
    """Invalid meta data given"""
 
77
 
50
78
    _dbus_error_name = "org.debian.apt.InvalidMetaData"
51
79
 
52
 
class InvalidProxyError(APTDError):
 
80
 
 
81
class InvalidProxyError(AptDaemonError):
 
82
 
53
83
    """Invalid proxy given"""
 
84
 
54
85
    _dbus_error_name = "org.debian.apt.InvalidProxy"
 
86
 
55
87
    def __init__(self, proxy):
56
 
        APTDError.__init__(self, "InvalidProxyError: %s" % proxy)
57
 
 
58
 
class TransactionCancelled(APTDError):
 
88
        AptDaemonError.__init__(self, "InvalidProxyError: %s" % proxy)
 
89
 
 
90
 
 
91
class TransactionCancelled(AptDaemonError):
 
92
 
59
93
    """Internal error if a transaction was cancelled."""
 
94
 
60
95
    _dbus_error_name = "org.debian.apt.TransactionCancelled"
61
96
 
62
 
class NotAuthorizedError(APTDError):
63
 
    """Missing authorization for a given method"""
64
 
    _dbus_error_name = "org.debian.apt.NotAuthorized"
65
 
    def __init__(self, action, sender):
66
 
        APTDError.__init__(self, "NotAuthorizedError: %s %s" % (action, sender))
67
 
        self.sender = sender
68
 
        self.action = action
69
 
 
70
 
class RepositoryInvalidError(APTDError):
 
97
 
 
98
class RepositoryInvalidError(AptDaemonError):
 
99
 
71
100
    """The added repository is invalid"""
 
101
 
72
102
    _dbus_error_name = "org.debian.apt.RepositoryInvalid"
73
103
 
 
104
 
 
105
class NotAuthorizedError(dbus.DBusException):
 
106
 
 
107
    _dbus_error_name = "org.freedesktop.PolicyKit.Error.NotAuthorized"
 
108
 
 
109
    def __init__(self, subject, action_id):
 
110
        dbus.DBusException.__init__(self, "%s: %s" % (subject, action_id))
 
111
        self.action_id = action_id
 
112
        self.subject = subject
 
113
 
 
114
 
 
115
def convert_dbus_exception(func):
 
116
    """A decorator which maps a raised DBbus exception to a native one."""
 
117
    argnames, varargs, kwargs, defaults = inspect.getargspec(func)
 
118
    @wraps(func)
 
119
    def _convert_dbus_exception(*args, **kwargs):
 
120
        try:
 
121
            error_handler = kwargs["error_handler"]
 
122
        except KeyError:
 
123
            _args = list(args)
 
124
            try:
 
125
                index = argnames.index("error_handler")
 
126
                error_handler = _args[index]
 
127
            except (IndexError, ValueError):
 
128
                pass
 
129
            else:
 
130
                _args[index] = \
 
131
                        lambda err: error_handler(get_native_exception(err))
 
132
                args = tuple(_args)
 
133
        else:
 
134
            kwargs["error_handler"] = \
 
135
                    lambda err: error_handler(get_native_exception(err))
 
136
        try:
 
137
            return func(*args, **kwargs)
 
138
        except dbus.exceptions.DBusException, error:
 
139
            raise get_native_exception(error)
 
140
    return _convert_dbus_exception
 
141
 
 
142
def get_native_exception(error):
 
143
    """Map a DBus exception to a native one. This allows to make use of
 
144
    try/except on the client side without having to check for the error name.
 
145
    """
 
146
    dbus_name = error.get_dbus_name()
 
147
    dbus_msg = error.get_dbus_message()
 
148
    if dbus_name == TransactionFailed._dbus_error_name:
 
149
        return TransactionFailed(*dbus_msg.split(":", 1))
 
150
    elif dbus_name == NotAuthorizedError._dbus_error_name:
 
151
        return NotAuthorizedError(*dbus_msg.split(":", 1))
 
152
    for error_cls in [AptDaemonError, TransactionRoleAlreadySet,
 
153
                      TransactionAlreadyRunning, ForeignTransaction,
 
154
                      InvalidMetaDataError, InvalidProxyError,
 
155
                      TransactionCancelled, RepositoryInvalidError]:
 
156
        if dbus_name == error_cls._dbus_error_name:
 
157
            return error_cls(dbus_msg)
 
158
    return error
 
159
 
74
160
# vim:ts=4:sw=4:et