d24f151e6d1af2e0a5cc2105f0b3ff64c679b45b
[~helmut/onoff.git] / dbus_client.py
1 #!/usr/bin/env python
2 """
3 A simpe client for an onoff device. If no parameters are given, the device
4 is activated for 10 seconds. When a command is given, the device is activated,
5 then the command is run. 10 seconds after the command finishes, the device is
6 released.
7 """
8
9 import os
10 import sys
11
12 import dbus
13 from dbus.mainloop.glib import DBusGMainLoop
14 from gi.repository import GObject
15
16 from onoff.common import ST_ACTIVE
17
18 def wait_for_signal(proxy, signal):
19     loop = GObject.MainLoop()
20     state = []
21     def callback(st):
22         state.append(st)
23         loop.quit()
24     proxy.connect_to_signal(signal, callback)
25     loop.run()
26     return state[0]
27
28 def main():
29     DBusGMainLoop(set_as_default=True)
30     bus = dbus.SessionBus()
31     proxy = bus.get_object("de.subdivi.onoff0", "/de/subdivi/onoff0/redshift")
32     if len(sys.argv) > 1:
33         st, fd = proxy.activatefd(10)
34         fd = fd.take()
35         os.dup2(fd, 254)
36         os.close(fd)
37         if st != ST_ACTIVE:
38             print("state is %d waiting for signal" % st)
39             st = wait_for_signal(proxy, "changestate")
40             print("new state is %d" % st)
41         os.execvp(sys.argv[1], sys.argv[1:])
42     else:
43         st = proxy.activatetime(10)
44         if st != ST_ACTIVE:
45             print("state is %d waiting for signal" % st)
46             st = wait_for_signal(proxy, "changestate")
47             print("new state is %d" % st)
48
49 if __name__ == "__main__":
50     main()