move the socketpair utility to dbusutils
[~helmut/onoff.git] / onoff / dbusutils.py
1 import argparse
2 import socket
3
4 import dbus
5
6 object_prefix = "/de/subdivi/onoff0"
7
8 dbus_options = argparse.ArgumentParser(add_help=False)
9 dbus_options.add_argument("--bus", default="session",
10                           choices=("system", "session"),
11                           help="which bus to use (default: %(default)s)")
12 dbus_options.add_argument("--busname", type=str, required=True,
13                           help="which busname (i.e. client) to use")
14 dbus_options.add_argument("--device", type=str, required=True,
15                           help="which device to control")
16
17 def get_dbus_proxy(namespace):
18     """
19     @param namespace: a namespace returned from a dbus_options argument parser
20     @returns: a dbus object proxy
21     """
22     if namespace.bus == "session":
23         bus = dbus.SessionBus()
24     elif namespace.bus == "system":
25         bus = dbus.SystemBus()
26     else:
27         raise AssertionError("namespace.bus %r is neither session nor system",
28                              namespace.bus)
29     objname = "%s/%s" % (object_prefix, namespace.device)
30     return bus.get_object(namespace.busname, objname)
31
32 def socketpair():
33     """Create a socket pair where the latter end is already wrapped for
34     transmission over dbus.
35
36     @rtype: (socket, dbus.types.UnixFd)
37     """
38     s1, s2 = socket.socketpair()
39     s3 = dbus.types.UnixFd(s2)
40     s2.close()
41     return s1, s3