3100a46c72668186c2b70ecff4c97f45447bf396
[nepi.git] / src / nepi / testbeds / omf / omf_client.py
1 import logging
2 import sleekxmpp
3 from sleekxmpp.exceptions import IqError, IqTimeout
4 import traceback
5 from xml.etree import cElementTree as ET
6
7 class OMFClient(sleekxmpp.ClientXMPP):
8     def __init__(self, jid, password):
9         sleekxmpp.ClientXMPP.__init__(self, jid, password)
10         self._ready = False
11         self._registered = False
12         self._server = None
13
14         self.register_plugin('xep_0077') # In-band registration
15         self.register_plugin('xep_0030')
16         self.register_plugin('xep_0059')
17         self.register_plugin('xep_0060') # PubSub 
18
19         self.add_event_handler("session_start", self.start)
20         self.add_event_handler("register", self.register)
21     
22     @property
23     def ready(self):
24         return self._ready
25
26     def start(self, event):
27         self.send_presence()
28         self._ready = True
29         self._server = "pubsub.%s" % self.boundjid.domain
30
31     def register(self, iq):
32         if self._registered:
33             logging.info("%s already registered!" % self.boundjid)
34             return 
35
36         resp = self.Iq()
37         resp['type'] = 'set'
38         resp['register']['username'] = self.boundjid.user
39         resp['register']['password'] = self.password
40
41         try:
42             resp.send(now=True)
43             logging.info("Account created for %s!" % self.boundjid)
44             self._registered = True
45         except IqError as e:
46             logging.error("Could not register account: %s" %
47                     e.iq['error']['text'])
48         except IqTimeout:
49             logging.error("No response from server.")
50
51     def unregister(self):
52         try:
53             self.plugin['xep_0077'].cancel_registration(
54                 ifrom=self.boundjid.full)
55             logging.info("Account unregistered for %s!" % self.boundjid)
56         except IqError as e:
57             logging.error("Could not unregister account: %s" %
58                     e.iq['error']['text'])
59         except IqTimeout:
60             logging.error("No response from server.")
61
62     def nodes(self):
63         try:
64             result = self['xep_0060'].get_nodes(self._server)
65             for item in result['disco_items']['items']:
66                 print(' - %s' % str(item))
67             return result
68         except:
69             print traceback.format_exc()
70             logging.error('Could not retrieve node list.')
71
72     def suscriptions(self):
73         try:
74             result = self['xep_0060'].get_subscriptions(self._server)
75                 #self.boundjid.full)
76             for node in result['node']:
77                 print(' - %s' % str(node))
78             return result
79         except:
80             print traceback.format_exc()
81             logging.error('Could not retrieve suscriptions.')
82
83
84     def create(self, node):
85         config = self['xep_0004'].makeForm('submit')
86         config.add_field(var='pubsub#node_type', value='leaf')
87         config.add_field(var='pubsub#notify_retract', value='0')
88         config.add_field(var='pubsub#publish_model', value='open')
89         config.add_field(var='pubsub#persist_items', value='1')
90         config.add_field(var='pubsub#max_items', value='1')
91         config.add_field(var='pubsub#title', value=node)
92
93         try:
94             self['xep_0060'].create_node(self._server, node, config = config)
95         except:
96             print traceback.format_exc()
97             logging.error('Could not create node: %s' % node)
98
99     def delete(self, node):
100         try:
101             self['xep_0060'].delete_node(self._server, node)
102             print('Deleted node: %s' % node)
103         except:
104             print traceback.format_exc()
105             logging.error('Could not delete node: %s' % node)
106
107     
108     def publish(self, data, node):
109         try:
110             result = self['xep_0060'].publish(self._server,node,payload=data)
111             id = result['pubsub']['publish']['item']['id']
112             print('Published at item id: %s' % id)
113         except:
114             print traceback.format_exc()
115             logging.error('Could not publish to: %s' % self.boundjid)
116
117     def get(self, data):
118         try:
119             result = self['xep_0060'].get_item(self._server, self.boundjid,
120                 data)
121             for item in result['pubsub']['items']['substanzas']:
122                 print('Retrieved item %s: %s' % (item['id'], tostring(item['payload'])))
123         except:
124             print traceback.format_exc()
125             logging.error('Could not retrieve item %s from node %s' % (data, self.boundjid))
126
127     def retract(self, data):
128         try:
129             result = self['xep_0060'].retract(self._server, self.boundjid, data)
130             print('Retracted item %s from node %s' % (data, self.boundjid))
131         except:
132             print traceback.format_exc()
133             logging.error('Could not retract item %s from node %s' % (data, self.boundjid))
134
135     def purge(self):
136         try:
137             result = self['xep_0060'].purge(self._server, self.boundjid)
138             print('Purged all items from node %s' % self.boundjid)
139         except:
140             print traceback.format_exc()
141             logging.error('Could not purge items from node %s' % self.boundjid)
142
143     def subscribe(self, node):
144         try:
145             result = self['xep_0060'].subscribe(self._server, node)
146             print('Subscribed %s to node %s' % (self.boundjid.bare, self.boundjid))
147         except:
148             print traceback.format_exc()
149             logging.error('Could not subscribe %s to node %s' % (self.boundjid.bare, node))
150
151     def unsubscribe(self, node):
152         try:
153             result = self['xep_0060'].unsubscribe(self._server, node)
154             print('Unsubscribed %s from node %s' % (self.boundjid.bare, node))
155         except:
156             print traceback.format_exc()
157             logging.error('Could not unsubscribe %s from node %s' % (self.boundjid.bare, node))
158
159