0ee6b7a8658b0ec97df1e51f33ef57fe5ccc7646
[~helmut/onoff.git] / dbus_client.py
1 #!/usr/bin/env python
2 """
3 A simpe client for an onoff device. If no command is given, the device is
4 temporarily activated. When a command is given, the device is activated, then
5 the command is run. Some time 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                         help="a command to be executed with the device being" +
35                              "activated for the duration of the execution")
36     args = parser.parse_args()
37     DBusGMainLoop(set_as_default=True)
38     proxy = onoff.dbusutils.get_dbus_proxy(args)
39     if args.command:
40         st, fd = proxy.activatefd()
41         fd = fd.take()
42         os.dup2(fd, 254)
43         os.close(fd)
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         os.execvp(args.command[0], args.command)
49     else:
50         st = proxy.activatetime(args.duration)
51         if st != ST_ACTIVE:
52             print("state is %d waiting for signal" % st)
53             st = wait_for_signal(proxy, "changestate")
54             print("new state is %d" % st)
55
56 if __name__ == "__main__":
57     main()