1bec79946ba3c6a62abeec8737ffbe3a263698b6
[~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 argparse
10 import os
11
12 from dbus.mainloop.glib import DBusGMainLoop
13 from gi.repository import GObject
14
15 from onoff.common import ST_ACTIVE
16 import onoff.dbusutils
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     parser = argparse.ArgumentParser(parents=[onoff.dbusutils.dbus_options])
30     parser.add_argument("--duration", type=int, default=10,
31                         help="how long to activate the device in seconds " +
32                         "(default: %(default)d")
33     parser.add_argument("command", nargs=argparse.REMAINDER)
34     args = parser.parse_args()
35     DBusGMainLoop(set_as_default=True)
36     proxy = onoff.dbusutils.get_dbus_proxy(args)
37     if args.command:
38         st, fd = proxy.activatefd(args.duration)
39         fd = fd.take()
40         os.dup2(fd, 254)
41         os.close(fd)
42         if st != ST_ACTIVE:
43             print("state is %d waiting for signal" % st)
44             st = wait_for_signal(proxy, "changestate")
45             print("new state is %d" % st)
46         os.execvp(args.command[0], args.command)
47     else:
48         st = proxy.activatetime(args.duration)
49         if st != ST_ACTIVE:
50             print("state is %d waiting for signal" % st)
51             st = wait_for_signal(proxy, "changestate")
52             print("new state is %d" % st)
53
54 if __name__ == "__main__":
55     main()