X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=src%2Fnepi%2Fresources%2Fomf%2Fomf_client.py;h=113bd1e3cb42212ce57d8bddd47f00c284231f54;hb=f025a30a215310a9803067a25e244137b71f56f2;hp=e5058f3ef29c6af73bdaca8ca13808141ef05f9e;hpb=eb111746f316ddd70f6eed77e432151c8ab96fe6;p=nepi.git
diff --git a/src/nepi/resources/omf/omf_client.py b/src/nepi/resources/omf/omf_client.py
index e5058f3e..113bd1e3 100644
--- a/src/nepi/resources/omf/omf_client.py
+++ b/src/nepi/resources/omf/omf_client.py
@@ -1,20 +1,53 @@
-import logging
-import sleekxmpp
-from sleekxmpp.exceptions import IqError, IqTimeout
+#
+# NEPI, a framework to manage network experiments
+# Copyright (C) 2013 INRIA
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see .
+#
+# Author: Alina Quereilhac
+# Julien Tribino
+
+from nepi.util.logger import Logger
+from nepi.resources.omf.omf6_parser import OMF6Parser
+
+try:
+ import sleekxmpp
+ from sleekxmpp.exceptions import IqError, IqTimeout
+ class BaseOMFClient(sleekxmpp.ClientXMPP):
+ pass
+except ImportError:
+ print "SleekXMPP is not installed. Without this library, \n" + \
+ " You will be not able to use OMF Resources \n"+ \
+ " If you want to install SleekXmpp : \n"+ \
+ " git clone -b develop git://github.com/fritzy/SleekXMPP.git \n"+ \
+ " cd SleekXMPP \n"+ \
+ "sudo python setup.py install\n"
+ class BaseOMFClient(object):
+ pass
+
import traceback
import xml.etree.ElementTree as ET
-import nepi
-
-# inherit from BaseXmpp and XMLStream classes
-class OMFClient(sleekxmpp.ClientXMPP):
+# inherit from BaseXmpp and XMLstream classes
+class OMFClient(sleekxmpp.ClientXMPP, Logger):
"""
.. class:: Class Args :
:param jid: Jabber Id (= Xmpp Slice + Date)
- :type jid: Str
+ :type jid: str
:param password: Jabber Password (= Xmpp Password)
- :type password: Str
+ :type password: str
.. note::
@@ -26,16 +59,19 @@ class OMFClient(sleekxmpp.ClientXMPP):
"""
:param jid: Jabber Id (= Xmpp Slice + Date)
- :type jid: Str
+ :type jid: str
:param password: Jabber Password (= Xmpp Password)
- :type password: Str
+ :type password: str
"""
+ Logger.__init__(self, "OMFClient")
+
sleekxmpp.ClientXMPP.__init__(self, jid, password)
self._ready = False
self._registered = False
self._server = None
+ self._parser = None
self.register_plugin('xep_0077') # In-band registration
self.register_plugin('xep_0030')
@@ -45,9 +81,15 @@ class OMFClient(sleekxmpp.ClientXMPP):
self.add_event_handler("session_start", self.start)
self.add_event_handler("register", self.register)
self.add_event_handler("pubsub_publish", self.handle_omf_message)
+
+ #Init the parser
+ self._init_parser()
- self._logger = logging.getLogger("nepi.omf.xmppClient")
- self._logger.setLevel(nepi.LOGLEVEL)
+ def _init_parser(self):
+ """ Init the parser depending on the OMF Version
+
+ """
+ self._parser = OMF6Parser()
@property
def ready(self):
@@ -69,7 +111,8 @@ class OMFClient(sleekxmpp.ClientXMPP):
"""
if self._registered:
- self._logger.info(" %s already registered!" % self.boundjid)
+ msg = " %s already registered!" % self.boundjid
+ self.info(msg)
return
resp = self.Iq()
@@ -79,13 +122,15 @@ class OMFClient(sleekxmpp.ClientXMPP):
try:
resp.send(now=True)
- self._logger.info(" Account created for %s!" % self.boundjid)
+ msg = " Account created for %s!" % self.boundjid
+ self.info(msg)
self._registered = True
except IqError as e:
- self._logger.error(" Could not register account: %s" %
- e.iq['error']['text'])
+ msg = " Could not register account: %s" % e.iq['error']['text']
+ self.error(msg)
except IqTimeout:
- self._logger.error(" No response from server.")
+ msg = " No response from server."
+ self.error(msg)
def unregister(self):
""" Unregister from the Xmppp Server.
@@ -94,12 +139,14 @@ class OMFClient(sleekxmpp.ClientXMPP):
try:
self.plugin['xep_0077'].cancel_registration(
ifrom=self.boundjid.full)
- self._logger.info(" Account unregistered for %s!" % self.boundjid)
+ msg = " Account unregistered for %s!" % self.boundjid
+ self.info(msg)
except IqError as e:
- self._logger.error(" Could not unregister account: %s" %
- e.iq['error']['text'])
+ msg = " Could not unregister account: %s" % e.iq['error']['text']
+ self.error(msg)
except IqTimeout:
- self._logger.error(" No response from server.")
+ msg = " No response from server."
+ self.error(msg)
def nodes(self):
""" Get all the nodes of the Xmppp Server.
@@ -108,11 +155,13 @@ class OMFClient(sleekxmpp.ClientXMPP):
try:
result = self['xep_0060'].get_nodes(self._server)
for item in result['disco_items']['items']:
- self._logger.info(' - %s' % str(item))
+ msg = ' - %s' % str(item)
+ self.debug(msg)
return result
except:
error = traceback.format_exc()
- self._logger.error(' Could not retrieve node list.\ntraceback:\n%s', error)
+ msg = 'Could not retrieve node list.\ntraceback:\n%s' % error
+ self.error(msg)
def subscriptions(self):
""" Get all the subscriptions of the Xmppp Server.
@@ -122,11 +171,13 @@ class OMFClient(sleekxmpp.ClientXMPP):
result = self['xep_0060'].get_subscriptions(self._server)
#self.boundjid.full)
for node in result['node']:
- self._logger.info(' - %s' % str(node))
+ msg = ' - %s' % str(node)
+ self.debug(msg)
return result
except:
error = traceback.format_exc()
- self._logger.error(' Could not retrieve subscriptions.\ntraceback:\n%s', error)
+ msg = ' Could not retrieve subscriptions.\ntraceback:\n%s' % error
+ self.error(msg)
def create(self, node):
""" Create the topic corresponding to the node
@@ -135,7 +186,8 @@ class OMFClient(sleekxmpp.ClientXMPP):
:type node: str
"""
- self._logger.debug(" Create Topic : " + node)
+ msg = " Create Topic : " + node
+ self.info(msg)
config = self['xep_0004'].makeForm('submit')
config.add_field(var='pubsub#node_type', value='leaf')
@@ -148,8 +200,10 @@ class OMFClient(sleekxmpp.ClientXMPP):
try:
self['xep_0060'].create_node(self._server, node, config = config)
except:
- error = traceback.format_exc()
- self._logger.error(' Could not create topic: %s\ntraceback:\n%s' % (node, error))
+ #error = traceback.format_exc()
+ #msg = ' Could not create topic: %s\ntraceback:\n%s' % (node, error)
+ msg = 'Could not create the topic : '+node+' . Maybe the topic already exists'
+ self.error(msg)
def delete(self, node):
""" Delete the topic corresponding to the node
@@ -163,10 +217,13 @@ class OMFClient(sleekxmpp.ClientXMPP):
#print " length of the queue : " + str(self.event_queue.qsize())
try:
self['xep_0060'].delete_node(self._server, node)
- self._logger.info(' Deleted node: %s' % node)
+ msg = ' Deleted node: %s' % node
+ self.info(msg)
except:
- error = traceback.format_exc()
- self._logger.error(' Could not delete topic: %s\ntraceback:\n%s' % (node, error))
+ #error = traceback.format_exc()
+ #msg = ' Could not delete topic: %s\ntraceback:\n%s' % (node, error)
+ msg = 'Could not delete the topic : '+node+' . Maybe It is not the owner of the topic'
+ self.error(msg)
def publish(self, data, node):
""" Publish the data to the corresponding topic
@@ -178,15 +235,16 @@ class OMFClient(sleekxmpp.ClientXMPP):
"""
- self._logger.debug(" Publish to Topic : " + node)
+ msg = " Publish to Topic : " + node
+ self.info(msg)
try:
result = self['xep_0060'].publish(self._server,node,payload=data)
# id = result['pubsub']['publish']['item']['id']
# print('Published at item id: %s' % id)
except:
error = traceback.format_exc()
- self._logger.error(' Could not publish to: %s\ntraceback:\n%s' \
- % (node, error))
+ msg = ' Could not publish to: %s\ntraceback:\n%s' % (node, error)
+ self.error(msg)
def get(self, data):
""" Get the item
@@ -200,12 +258,13 @@ class OMFClient(sleekxmpp.ClientXMPP):
result = self['xep_0060'].get_item(self._server, self.boundjid,
data)
for item in result['pubsub']['items']['substanzas']:
- self._logger.info('Retrieved item %s: %s' % (item['id'],
- tostring(item['payload'])))
+ msg = 'Retrieved item %s: %s' % (item['id'], tostring(item['payload']))
+ self.debug(msg)
except:
error = traceback.format_exc()
- self._logger.error(' Could not retrieve item %s from topic %s\ntraceback:\n%s' \
- % (data, self.boundjid, error))
+ msg = ' Could not retrieve item %s from topic %s\ntraceback:\n%s' \
+ % (data, self.boundjid, error)
+ self.error(msg)
def retract(self, data):
""" Retract the item
@@ -216,11 +275,13 @@ class OMFClient(sleekxmpp.ClientXMPP):
"""
try:
result = self['xep_0060'].retract(self._server, self.boundjid, data)
- self._logger.info(' Retracted item %s from topic %s' % (data, self.boundjid))
+ msg = ' Retracted item %s from topic %s' % (data, self.boundjid)
+ self.debug(msg)
except:
error = traceback.format_exc()
- self._logger.error(' Could not retract item %s from topic %s\ntraceback:\n%s' \
- % (data, self.boundjid, error))
+ msg = 'Could not retract item %s from topic %s\ntraceback:\n%s' \
+ % (data, self.boundjid, error)
+ self.error(msg)
def purge(self):
""" Purge the information in the server
@@ -228,11 +289,13 @@ class OMFClient(sleekxmpp.ClientXMPP):
"""
try:
result = self['xep_0060'].purge(self._server, self.boundjid)
- self._logger.info(' Purged all items from topic %s' % self.boundjid)
+ msg = ' Purged all items from topic %s' % self.boundjid
+ self.debug(msg)
except:
error = traceback.format_exc()
- self._logger.error(' Could not purge items from topic %s\ntraceback:\n%s' \
- % (self.boundjid, error))
+ msg = ' Could not purge items from topic %s\ntraceback:\n%s' \
+ % (self.boundjid, error)
+ self.error(msg)
def subscribe(self, node):
""" Subscribe to a topic
@@ -243,14 +306,15 @@ class OMFClient(sleekxmpp.ClientXMPP):
"""
try:
result = self['xep_0060'].subscribe(self._server, node)
- #self._logger.debug('Subscribed %s to node %s' \
- #% (self.boundjid.bare, node))
- self._logger.info(' Subscribed %s to topic %s' \
- % (self.boundjid.user, node))
+ msg = ' Subscribed %s to topic %s' \
+ % (self.boundjid.user, node)
+ #self.info(msg)
+ self.debug(msg)
except:
error = traceback.format_exc()
- self._logger.error(' Could not subscribe %s to topic %s\ntraceback:\n%s' \
- % (self.boundjid.bare, node, error))
+ msg = ' Could not subscribe %s to topic %s\ntraceback:\n%s' \
+ % (self.boundjid.bare, node, error)
+ self.error(msg)
def unsubscribe(self, node):
""" Unsubscribe to a topic
@@ -261,49 +325,25 @@ class OMFClient(sleekxmpp.ClientXMPP):
"""
try:
result = self['xep_0060'].unsubscribe(self._server, node)
- self._logger.info(' Unsubscribed %s from topic %s' % (self.boundjid.bare, node))
+ msg = ' Unsubscribed %s from topic %s' % (self.boundjid.bare, node)
+ self.debug(msg)
except:
error = traceback.format_exc()
- self._logger.error(' Could not unsubscribe %s from topic %s\ntraceback:\n%s' \
- % (self.boundjid.bare, node, error))
+ msg = ' Could not unsubscribe %s from topic %s\ntraceback:\n%s' \
+ % (self.boundjid.bare, node, error)
+ self.error(msg)
- def _check_for_tag(self, root, namespaces, tag):
- """ Check if an element markup is in the ElementTree
+ def check_mailbox(self, itype, attr):
+ """ Check the mail box
- :param root: Root of the tree
- :type root: ElementTree Element
- :param namespaces: Namespaces of the element
- :type namespaces: str
- :param tag: Tag that will search in the tree
- :type tag: str
+ :param itype: type of mail
+ :type itype: str
+ :param attr: value wanted
+ :type attr: str
"""
- for element in root.iter(namespaces+tag):
- if element.text:
- return element
- else :
- return None
-
- def _check_output(self, root, namespaces):
- """ Check the significative element in the answer and display it
+ return self._parser.check_mailbox(itype, attr)
- :param root: Root of the tree
- :type root: ElementTree Element
- :param namespaces: Namespaces of the tree
- :type namespaces: str
-
- """
- fields = ["TARGET", "REASON", "PATH", "APPID", "VALUE"]
- response = ""
- for elt in fields:
- msg = self._check_for_tag(root, namespaces, elt)
- if msg is not None:
- response = response + " " + msg.text + " :"
- deb = self._check_for_tag(root, namespaces, "MESSAGE")
- if deb is not None:
- self._logger.debug(response + " " + deb.text)
- else :
- self._logger.info(response)
def handle_omf_message(self, iq):
""" Handle published/received message
@@ -312,9 +352,5 @@ class OMFClient(sleekxmpp.ClientXMPP):
:type iq: Iq Stanza
"""
- namespaces = "{http://jabber.org/protocol/pubsub}"
- for i in iq['pubsub_event']['items']:
- root = ET.fromstring(str(i))
- self._check_output(root, namespaces)
-
+ self._parser.handle(iq)