13
import dbus.mainloop.glib
14
except ImportError, e:
15
sys.stderr.write("Failed to import '%s', can not use dbus" % e)
18
class PermissionDeniedError(dbus.DBusException):
19
" permission denied by policy "
22
class AptXapianIndexDBusService(dbus.service.Object):
23
DBUS_INTERFACE_NAME = "org.debian.AptXapianIndex"
26
bus_name = dbus.service.BusName(self.DBUS_INTERFACE_NAME,
28
dbus.service.Object.__init__(self, bus_name, '/')
30
def _authWithPolicyKit(self, sender, connection, priv):
31
system_bus = dbus.SystemBus()
32
obj = system_bus.get_object("org.freedesktop.PolicyKit1",
33
"/org/freedesktop/PolicyKit1/Authority",
34
"org.freedesktop.PolicyKit1.Authority")
35
policykit = dbus.Interface(obj, "org.freedesktop.PolicyKit1.Authority")
36
info = dbus.Interface(connection.get_object('org.freedesktop.DBus',
37
'/org/freedesktop/DBus/Bus',
39
'org.freedesktop.DBus')
40
pid = info.GetConnectionUnixProcessID(sender)
41
subject = ('unix-process',
42
{ 'pid' : dbus.UInt32(pid, variant_level=1),
47
flags = dbus.UInt32(1) # AllowUserInteraction = 0x00000001
49
(ok, notused, details) = policykit.CheckAuthorization(
50
subject, priv, details, flags, cancel_id)
53
@dbus.service.signal(dbus_interface=DBUS_INTERFACE_NAME,
55
def UpdateFinished(self, res):
56
logging.debug("Emitting UpdateFinished: %s" % res)
58
@dbus.service.signal(dbus_interface=DBUS_INTERFACE_NAME,
60
def UpdateProgress(self, percent):
61
logging.debug("Emitting UpdateProgress: %s" % percent)
63
def _update_apt_xapian_index(self, cmd):
64
p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
66
while gobject.main_context_default().pending():
67
gobject.main_context_default().iteration()
71
line = p.stdout.readline().strip()
75
(op, progress) = string.split(line, sep=":", maxsplit=1)
77
percent = int(progress.split("/")[0])
78
self.UpdateProgress(percent)
82
self.UpdateFinished(res == 0)
84
@dbus.service.method(DBUS_INTERFACE_NAME,
87
sender_keyword='sender',
88
connection_keyword='conn')
89
def update_async(self, force, update_only, sender=None, conn=None):
90
if not self._authWithPolicyKit(sender, conn,
91
"org.debian.aptxapianindex.update"):
92
raise PermissionDeniedError, "Permission denied by policy"
93
cmd = ["/usr/sbin/update-apt-xapian-index", "--batch-mode"]
97
cmd.append("--update")
98
glib.timeout_add(100, self._update_apt_xapian_index, cmd)
100
if __name__ == "__main__":
101
dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
102
server = AptXapianIndexDBusService()
103
gobject.MainLoop().run()