some reconnetion fixes

This commit is contained in:
Tom Nichols 2010-05-12 16:51:14 -04:00
parent 6bc6ebb95d
commit 7552efee5c
3 changed files with 41 additions and 22 deletions

View file

@ -1,11 +1,11 @@
#!/usr/bin/python2.5
"""
SleekXMPP: The Sleek XMPP Library
Copyright (C) 2010 Nathanael C. Fritz
This file is part of SleekXMPP.
SleekXMPP: The Sleek XMPP Library
Copyright (C) 2010 Nathanael C. Fritz
This file is part of SleekXMPP.
See the file license.txt for copying permission.
See the file license.txt for copying permission.
"""
from __future__ import absolute_import, unicode_literals
from . basexmpp import basexmpp
@ -53,12 +53,14 @@ class ClientXMPP(basexmpp, XMLStream):
self.plugin_config = plugin_config
self.escape_quotes = escape_quotes
self.set_jid(jid)
self.server = None
self.port = 5222 # not used if DNS SRV is used
self.plugin_whitelist = plugin_whitelist
self.auto_reconnect = True
self.srvsupport = srvsupport
self.password = password
self.registered_features = []
self.stream_header = """<stream:stream to='%s' xmlns:stream='http://etherx.jabber.org/streams' xmlns='%s' version='1.0'>""" % (self.server,self.default_ns)
self.stream_header = """<stream:stream to='%s' xmlns:stream='http://etherx.jabber.org/streams' xmlns='%s' version='1.0'>""" % (self.domain,self.default_ns)
self.stream_footer = "</stream:stream>"
#self.map_namespace('http://etherx.jabber.org/streams', 'stream')
#self.map_namespace('jabber:client', '')
@ -87,16 +89,20 @@ class ClientXMPP(basexmpp, XMLStream):
def get(self, key, default):
return self.plugin.get(key, default)
def connect(self, address=tuple()):
def connect(self, host=None, port=None):
"""Connect to the Jabber Server. Attempts SRV lookup, and if it fails, uses
the JID server."""
if not address or len(address) < 2:
if host:
self.server = host
if port is None: port = self.port
else:
if not self.srvsupport:
logging.debug("Did not supply (address, port) to connect to and no SRV support is installed (http://www.dnspython.org). Continuing to attempt connection, using server hostname from JID.")
logging.debug("Did not supply (address, port) to connect to and no SRV support is installed (http://www.dnspython.org). Continuing to attempt connection, using domain from JID.")
else:
logging.debug("Since no address is supplied, attempting SRV lookup.")
try:
answers = dns.resolver.query("_xmpp-client._tcp.%s" % self.server, "SRV")
answers = dns.resolver.query("_xmpp-client._tcp.%s" % self.domain, "SRV")
except dns.resolver.NXDOMAIN:
logging.debug("No appropriate SRV record found. Using JID server name.")
else:
@ -113,12 +119,19 @@ class ClientXMPP(basexmpp, XMLStream):
picked = random.randint(0, intmax)
for priority in priorities:
if picked <= priority:
address = addresses[priority]
(host,port) = addresses[priority]
break
if not address:
# if SRV lookup was successful, we aren't using a particular server.
self.server = None
if not host:
# if all else fails take server from JID.
address = (self.server, 5222)
result = XMLStream.connect(self, address[0], address[1], use_tls=True)
(host,port) = (self.domain, self.port)
self.server = None
logging.debug('Attempting connection to %s:%d', host, port )
#TODO option to not use TLS?
result = XMLStream.connect(self, host, port, use_tls=True)
if result:
self.event("connected")
else:

View file

@ -49,7 +49,7 @@ class basexmpp(object):
self.resource = ''
self.jid = ''
self.username = ''
self.server = ''
self.domain = ''
self.plugin = {}
self.auto_authorize = True
self.auto_subscribe = True
@ -84,7 +84,7 @@ class basexmpp(object):
self.resource = self.getjidresource(jid)
self.jid = self.getjidbare(jid)
self.username = jid.split('@', 1)[0]
self.server = jid.split('@',1)[-1].split('/', 1)[0]
self.domain = jid.split('@',1)[-1].split('/', 1)[0]
def registerPlugin(self, plugin, pconfig = {}):
"""Register a plugin not in plugins.__init__.__all__ but in the plugins

View file

@ -146,13 +146,19 @@ class XMLStream(object):
def process(self, threaded=True):
for t in range(0, HANDLER_THREADS):
self.__thread['eventhandle%s' % t] = threading.Thread(name='eventhandle%s' % t, target=self._eventRunner)
self.__thread['eventhandle%s' % t].start()
self.__thread['sendthread'] = threading.Thread(name='sendthread', target=self._sendThread)
self.__thread['sendthread'].start()
th = threading.Thread(name='eventhandle%s' % t, target=self._eventRunner)
th.setDaemon(True)
self.__thread['eventhandle%s' % t] = th
th.start()
th = threading.Thread(name='sendthread', target=self._sendThread)
th.setDaemon(True)
self.__thread['sendthread'] = th
th.start()
if threaded:
self.__thread['process'] = threading.Thread(name='process', target=self._process)
self.__thread['process'].start()
th = threading.Thread(name='process', target=self._process)
th.setDaemon(True)
self.__thread['process'] = th
th.start()
else:
self._process()
@ -286,7 +292,7 @@ class XMLStream(object):
self.state.set('tls',False)
self.state.set('ssl',False)
time.sleep(1)
self.connect()
self.connect(self.server,self.port)
def incoming_filter(self, xmlobj):
return xmlobj