20
20
__author__ = "Sebastian Heinlein <devel@glatzor.de>"
22
__all__ = ("AptDaemonError", "ForeignTransaction", "InvalidMetaDataError",
23
"InvalidProxyError", "RepositoryInvalidError",
24
"TransactionAlreadyRunning", "TransactionCancelled",
25
"TransactionFailed", "TransactionRoleAlreadySet",
26
"NotAuthorizedError", "convert_dbus_exception",
27
"get_native_exception")
24
class APTDError(dbus.DBusException):
31
from functools import wraps
34
class AptDaemonError(dbus.DBusException):
25
36
"""Internal error of the aptdaemon"""
26
38
_dbus_error_name = "org.debian.apt"
28
class TransactionRoleAlreadySet(APTDError):
41
class TransactionRoleAlreadySet(AptDaemonError):
29
43
"""Error if a transaction has already been configured."""
30
45
_dbus_error_name = "org.debian.apt.TransactionRoleAlreadySet"
32
class TransactionAlreadyRunning(APTDError):
48
class TransactionAlreadyRunning(AptDaemonError):
33
50
"""Error if a transaction has already been configured."""
34
52
_dbus_error_name = "org.debian.apt.TransactionAlreadyRunning"
36
class ForeignTransaction(APTDError):
55
class ForeignTransaction(AptDaemonError):
37
57
"""Error if a transaction was initialized by a different user."""
38
59
_dbus_error_name = "org.debian.apt.TransactionAlreadyRunning"
40
class TransactionFailed(APTDError):
62
class TransactionFailed(AptDaemonError):
41
64
"""Internal error if a transaction could not be processed successfully."""
42
66
_dbus_error_name = "org.debian.apt.TransactionFailed"
43
def __init__(self, enum, msg=""):
44
APTDError.__init__(self)
48
class InvalidMetaDataError(APTDError):
68
def __init__(self, code, details=""):
69
AptDaemonError.__init__(self, "%s: %s" % (code, details))
71
self.details = details
74
class InvalidMetaDataError(AptDaemonError):
49
76
"""Invalid meta data given"""
50
78
_dbus_error_name = "org.debian.apt.InvalidMetaData"
52
class InvalidProxyError(APTDError):
81
class InvalidProxyError(AptDaemonError):
53
83
"""Invalid proxy given"""
54
85
_dbus_error_name = "org.debian.apt.InvalidProxy"
55
87
def __init__(self, proxy):
56
APTDError.__init__(self, "InvalidProxyError: %s" % proxy)
58
class TransactionCancelled(APTDError):
88
AptDaemonError.__init__(self, "InvalidProxyError: %s" % proxy)
91
class TransactionCancelled(AptDaemonError):
59
93
"""Internal error if a transaction was cancelled."""
60
95
_dbus_error_name = "org.debian.apt.TransactionCancelled"
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))
70
class RepositoryInvalidError(APTDError):
98
class RepositoryInvalidError(AptDaemonError):
71
100
"""The added repository is invalid"""
72
102
_dbus_error_name = "org.debian.apt.RepositoryInvalid"
105
class NotAuthorizedError(dbus.DBusException):
107
_dbus_error_name = "org.freedesktop.PolicyKit.Error.NotAuthorized"
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
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)
119
def _convert_dbus_exception(*args, **kwargs):
121
error_handler = kwargs["error_handler"]
125
index = argnames.index("error_handler")
126
error_handler = _args[index]
127
except (IndexError, ValueError):
131
lambda err: error_handler(get_native_exception(err))
134
kwargs["error_handler"] = \
135
lambda err: error_handler(get_native_exception(err))
137
return func(*args, **kwargs)
138
except dbus.exceptions.DBusException, error:
139
raise get_native_exception(error)
140
return _convert_dbus_exception
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.
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)
74
160
# vim:ts=4:sw=4:et