2 # UCC Door Server - Jabber/XMPP door client
4 # Released under an MIT-style license; see COPYING for details.
13 password = open(os.environ['HOME']+ '/.jabberpw', 'r').readline().strip()
16 # XXX: if the server process is not running, this client will terminate
17 # XXX: if the server process stops, there is not notification, and old
18 # statuses will be persisted until it is restarted
20 def __init__(self, doorname):
21 self.presences = {-1: {'show': 'dnd', 'status': 'busted'},
22 0: {'show': 'away', 'status': 'closed'},
23 1: {'show': 'chat', 'status': 'open'},}
26 self.presences = {-1: {'show': 'dnd', 'status': 'busted'},
27 0: {'show': 'away', 'status': 'nothing moves'},
28 1: {'show': 'chat', 'status': 'there is movement'},}
32 # connect to hardware server over D-BUS
33 self.remoteobj = system_bus.get_object('au.asn.ucc.DoorServer',
34 '/au/asn/ucc/doors/' + doorname)
35 self.remoteobj.connect_to_signal('status_changed', self.state_changed,
36 dbus_interface='au.asn.ucc.DoorInterface')
38 # connect to the Jabber server
39 self.jabberclient = xmpp.Client(server, debug=None)
40 self.jabberclient.connect()
41 self.jabberclient.auth(doorname, password)
42 # make self available via jabber, don't bother getting the contact list
43 self.jabberclient.sendInitPresence(requestRoster = 0)
46 new_state = self.remoteobj.get_status(dbus_interface='au.asn.ucc.DoorInterface')
48 syslog.syslog(142, "get_status failed: %s" % e)
51 self.doorname = doorname
52 self.state_changed(new_state)
54 def state_changed(self, new_state):
55 print "xmpp state change detected for %s from %i to %i" % (self.doorname, self.state, new_state)
56 self.state = new_state
57 # look up the dictionary object for the current state, then construct
58 # a presence object using that as a keyword argument
59 new_presence = xmpp.dispatcher.Presence(**self.presences[new_state])
60 self.jabberclient.send(new_presence)
62 if __name__ == '__main__':
64 from dbus.mainloop.glib import DBusGMainLoop
65 DBusGMainLoop(set_as_default=True)
67 system_bus = dbus.SystemBus()
69 # dictionary to hold door names and objects
70 doors = {'uccdoor': None, 'unisfadoor': None, 'chdoor': None, 'mrdoor': None, 'uccpir': None}
72 # create and save door objects
73 for doorname in doors.keys():
74 doors[doorname] = Door(doorname)
77 loop = gobject.MainLoop()
80 except KeyboardInterrupt: