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)