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 #!/usr/bin/python2.5
""" """
SleekXMPP: The Sleek XMPP Library SleekXMPP: The Sleek XMPP Library
Copyright (C) 2010 Nathanael C. Fritz Copyright (C) 2010 Nathanael C. Fritz
This file is part of SleekXMPP. 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 __future__ import absolute_import, unicode_literals
from . basexmpp import basexmpp from . basexmpp import basexmpp
@ -53,12 +53,14 @@ class ClientXMPP(basexmpp, XMLStream):
self.plugin_config = plugin_config self.plugin_config = plugin_config
self.escape_quotes = escape_quotes self.escape_quotes = escape_quotes
self.set_jid(jid) self.set_jid(jid)
self.server = None
self.port = 5222 # not used if DNS SRV is used
self.plugin_whitelist = plugin_whitelist self.plugin_whitelist = plugin_whitelist
self.auto_reconnect = True self.auto_reconnect = True
self.srvsupport = srvsupport self.srvsupport = srvsupport
self.password = password self.password = password
self.registered_features = [] 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.stream_footer = "</stream:stream>"
#self.map_namespace('http://etherx.jabber.org/streams', 'stream') #self.map_namespace('http://etherx.jabber.org/streams', 'stream')
#self.map_namespace('jabber:client', '') #self.map_namespace('jabber:client', '')
@ -87,16 +89,20 @@ class ClientXMPP(basexmpp, XMLStream):
def get(self, key, default): def get(self, key, default):
return self.plugin.get(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 """Connect to the Jabber Server. Attempts SRV lookup, and if it fails, uses
the JID server.""" 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: 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: else:
logging.debug("Since no address is supplied, attempting SRV lookup.") logging.debug("Since no address is supplied, attempting SRV lookup.")
try: 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: except dns.resolver.NXDOMAIN:
logging.debug("No appropriate SRV record found. Using JID server name.") logging.debug("No appropriate SRV record found. Using JID server name.")
else: else:
@ -113,12 +119,19 @@ class ClientXMPP(basexmpp, XMLStream):
picked = random.randint(0, intmax) picked = random.randint(0, intmax)
for priority in priorities: for priority in priorities:
if picked <= priority: if picked <= priority:
address = addresses[priority] (host,port) = addresses[priority]
break 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. # if all else fails take server from JID.
address = (self.server, 5222) (host,port) = (self.domain, self.port)
result = XMLStream.connect(self, address[0], address[1], use_tls=True) 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: if result:
self.event("connected") self.event("connected")
else: else:

View File

@ -49,7 +49,7 @@ class basexmpp(object):
self.resource = '' self.resource = ''
self.jid = '' self.jid = ''
self.username = '' self.username = ''
self.server = '' self.domain = ''
self.plugin = {} self.plugin = {}
self.auto_authorize = True self.auto_authorize = True
self.auto_subscribe = True self.auto_subscribe = True
@ -84,7 +84,7 @@ class basexmpp(object):
self.resource = self.getjidresource(jid) self.resource = self.getjidresource(jid)
self.jid = self.getjidbare(jid) self.jid = self.getjidbare(jid)
self.username = jid.split('@', 1)[0] 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 = {}): def registerPlugin(self, plugin, pconfig = {}):
"""Register a plugin not in plugins.__init__.__all__ but in the plugins """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): def process(self, threaded=True):
for t in range(0, HANDLER_THREADS): for t in range(0, HANDLER_THREADS):
self.__thread['eventhandle%s' % t] = threading.Thread(name='eventhandle%s' % t, target=self._eventRunner) th = threading.Thread(name='eventhandle%s' % t, target=self._eventRunner)
self.__thread['eventhandle%s' % t].start() th.setDaemon(True)
self.__thread['sendthread'] = threading.Thread(name='sendthread', target=self._sendThread) self.__thread['eventhandle%s' % t] = th
self.__thread['sendthread'].start() th.start()
th = threading.Thread(name='sendthread', target=self._sendThread)
th.setDaemon(True)
self.__thread['sendthread'] = th
th.start()
if threaded: if threaded:
self.__thread['process'] = threading.Thread(name='process', target=self._process) th = threading.Thread(name='process', target=self._process)
self.__thread['process'].start() th.setDaemon(True)
self.__thread['process'] = th
th.start()
else: else:
self._process() self._process()
@ -286,7 +292,7 @@ class XMLStream(object):
self.state.set('tls',False) self.state.set('tls',False)
self.state.set('ssl',False) self.state.set('ssl',False)
time.sleep(1) time.sleep(1)
self.connect() self.connect(self.server,self.port)
def incoming_filter(self, xmlobj): def incoming_filter(self, xmlobj):
return xmlobj return xmlobj