make clients configurable via argparse
authorHelmut Grohne <helmut@subdivi.de>
Tue, 18 Jun 2013 20:22:27 +0000 (22:22 +0200)
committerHelmut Grohne <helmut@subdivi.de>
Tue, 18 Jun 2013 20:22:27 +0000 (22:22 +0200)
dbus_client.py
dbus_service.py
mpd_watcher.py
onoff/dbusutils.py [new file with mode: 0644]

index d24f151..ae2d628 100755 (executable)
@@ -6,14 +6,14 @@ then the command is run. 10 seconds after the command finishes, the device is
 released.
 """
 
+import argparse
 import os
-import sys
 
-import dbus
 from dbus.mainloop.glib import DBusGMainLoop
 from gi.repository import GObject
 
 from onoff.common import ST_ACTIVE
+import onoff.dbusutils
 
 def wait_for_signal(proxy, signal):
     loop = GObject.MainLoop()
@@ -26,10 +26,12 @@ def wait_for_signal(proxy, signal):
     return state[0]
 
 def main():
+    parser = argparse.ArgumentParser(parents=[onoff.dbusutils.dbus_options])
+    parser.add_argument("command", nargs=argparse.REMAINDER)
+    args = parser.parse_args()
     DBusGMainLoop(set_as_default=True)
-    bus = dbus.SessionBus()
-    proxy = bus.get_object("de.subdivi.onoff0", "/de/subdivi/onoff0/redshift")
-    if len(sys.argv) > 1:
+    proxy = onoff.dbusutils.get_dbus_proxy(args)
+    if args.command:
         st, fd = proxy.activatefd(10)
         fd = fd.take()
         os.dup2(fd, 254)
@@ -38,7 +40,7 @@ def main():
             print("state is %d waiting for signal" % st)
             st = wait_for_signal(proxy, "changestate")
             print("new state is %d" % st)
-        os.execvp(sys.argv[1], sys.argv[1:])
+        os.execvp(args.command[0], args.command)
     else:
         st = proxy.activatetime(10)
         if st != ST_ACTIVE:
index d7b5231..3c35aa8 100755 (executable)
@@ -14,6 +14,7 @@ from dbus.mainloop.glib import DBusGMainLoop
 from gi.repository import GObject
 
 import onoff.common
+import onoff.dbusutils
 import onoff.process
 
 logger = logging.getLogger("dbus_service")
@@ -29,7 +30,7 @@ def dbus_socket_pair():
 
 class OnoffControl(dbus.service.Object):
     domain = "de.subdivi.onoff0"
-    path = "/de/subdivi/onoff0"
+    path = onoff.dbusutils.object_prefix
 
     def __init__(self, bus, name, device):
         busname = dbus.service.BusName(self.domain, bus=bus)
index 490312a..f085797 100755 (executable)
@@ -4,14 +4,15 @@ A client to a device given on the commnd line, that is activated whenever the
 local mpd plays music.
 """
 
+import argparse
 import os
-import sys
 
-import dbus
 from dbus.mainloop.glib import DBusGMainLoop
 from gi.repository import GObject
 import mpd
 
+import onoff.dbusutils
+
 class MpdWatcher(object):
     def __init__(self, mpdclient, onoffproxy):
         self.mpdclient = mpdclient
@@ -40,9 +41,10 @@ class MpdWatcher(object):
                 self.activatefd = None
 
 def main():
+    parser = argparse.ArgumentParser(parents=[onoff.dbusutils.dbus_options])
+    args = parser.parse_args()
     DBusGMainLoop(set_as_default=True)
-    bus = dbus.SessionBus()
-    proxy = bus.get_object("de.subdivi.onoff0", "/de/subdivi/onoff0/" + sys.argv[1])
+    proxy = onoff.dbusutils.get_dbus_proxy(args)
     client = mpd.MPDClient()
     client.connect("localhost", 6600)
     watcher = MpdWatcher(client, proxy)
diff --git a/onoff/dbusutils.py b/onoff/dbusutils.py
new file mode 100644 (file)
index 0000000..1305917
--- /dev/null
@@ -0,0 +1,29 @@
+import argparse
+
+import dbus
+
+object_prefix = "/de/subdivi/onoff0"
+
+dbus_options = argparse.ArgumentParser(add_help=False)
+dbus_options.add_argument("--bus", default="session",
+                          choices=("system", "session"),
+                          help="which bus to use (default: %(default)s)")
+dbus_options.add_argument("--busname", type=str, required=True,
+                          help="which busname (i.e. client) to use")
+dbus_options.add_argument("--device", type=str, required=True,
+                          help="which device to control")
+
+def get_dbus_proxy(namespace):
+    """
+    @param namespace: a namespace returned from a dbus_options argument parser
+    @returns: a dbus object proxy
+    """
+    if namespace.bus == "session":
+        bus = dbus.SessionBus()
+    elif namespace.bus == "system":
+        bus = dbus.SystemBus()
+    else:
+        raise AssertionError("namespace.bus %r is neither session nor system",
+                             namespace.bus)
+    objname = "%s/%s" % (object_prefix, namespace.device)
+    return bus.get_object(namespace.busname, objname)