コード例 #1
0
class Connection(object):
    def __init__(self):
        settings = Settings('tellduslive.config')
        uuid = settings['uuid']
        self.xmpp = ClientXMPP('*****@*****.**' % uuid,
                               '%s:%s' % (self.getMacAddr(), Board.secret()))
        self.xmpp.add_event_handler("session_start", self.sessionStart)
        self.xmpp.add_event_handler("register", self.register)
        self.xmpp.register_plugin('xep_0030')  # Service Discovery
        self.xmpp.register_plugin('xep_0077')  # In-band registration
        self.shuttingDown = False
        # Connect is blocking. Do this in a separate thread
        threading.Thread(target=self.__start, name='XMPP connector').start()

    def register(self, form):
        del form  # Unused
        resp = self.xmpp.Iq()
        resp['type'] = 'set'
        resp['register']['username'] = self.xmpp.boundjid.user
        resp['register']['password'] = self.xmpp.password
        try:
            resp.send(now=True)
            return
        except IqError as error:
            code = error.iq['error']['code']
            if code == '409':  # Already exists, this is ok
                return
        except IqTimeout:
            logging.warning("IQ timeout")
        logging.warning("Could not register, disconnect!")
        self.shutdown()

    def sessionStart(self, event):
        del event
        self.xmpp.send_presence()
        self.xmpp.get_roster()

    def shutdown(self):
        self.shuttingDown = True
        self.xmpp.disconnect()

    def __start(self):
        self.xmpp.connect()
        self.xmpp.process(block=False)
        if self.shuttingDown:
            self.xmpp.disconnect()

    @staticmethod
    def getMacAddr():
        addrs = netifaces.ifaddresses(Board.networkInterface())
        try:
            mac = addrs[netifaces.AF_LINK][0]['addr']
        except (IndexError, KeyError):
            return ''
        return mac.upper().replace(':', '')