Logging no longer uses root logger.

Each module should now log into its own logger.
This commit is contained in:
Lance Stout 2010-11-06 01:28:59 -04:00
parent d0c506f930
commit 4fb77ac878
22 changed files with 342 additions and 272 deletions

View File

@ -26,6 +26,9 @@ from sleekxmpp.xmlstream.matcher import *
from sleekxmpp.xmlstream.handler import * from sleekxmpp.xmlstream.handler import *
log = logging.getLogger(__name__)
# Flag indicating if DNS SRV records are available for use. # Flag indicating if DNS SRV records are available for use.
SRV_SUPPORT = True SRV_SUPPORT = True
try: try:
@ -192,9 +195,9 @@ class BaseXMPP(XMLStream):
xep = "(XEP-%s) " % self.plugin[plugin].xep xep = "(XEP-%s) " % self.plugin[plugin].xep
desc = (xep, self.plugin[plugin].description) desc = (xep, self.plugin[plugin].description)
logging.debug("Loaded Plugin %s%s" % desc) log.debug("Loaded Plugin %s%s" % desc)
except: except:
logging.exception("Unable to load plugin: %s", plugin) log.exception("Unable to load plugin: %s", plugin)
def register_plugins(self): def register_plugins(self):
""" """
@ -228,7 +231,7 @@ class BaseXMPP(XMLStream):
if key in self.plugin: if key in self.plugin:
return self.plugin[key] return self.plugin[key]
else: else:
logging.warning("""Plugin "%s" is not loaded.""" % key) log.warning("""Plugin "%s" is not loaded.""" % key)
return False return False
def get(self, key, default): def get(self, key, default):
@ -446,12 +449,12 @@ class BaseXMPP(XMLStream):
""" """
Attribute accessor for bare jid Attribute accessor for bare jid
""" """
logging.warning("jid property deprecated. Use boundjid.bare") log.warning("jid property deprecated. Use boundjid.bare")
return self.boundjid.bare return self.boundjid.bare
@jid.setter @jid.setter
def jid(self, value): def jid(self, value):
logging.warning("jid property deprecated. Use boundjid.bare") log.warning("jid property deprecated. Use boundjid.bare")
self.boundjid.bare = value self.boundjid.bare = value
@property @property
@ -459,12 +462,12 @@ class BaseXMPP(XMLStream):
""" """
Attribute accessor for full jid Attribute accessor for full jid
""" """
logging.warning("fulljid property deprecated. Use boundjid.full") log.warning("fulljid property deprecated. Use boundjid.full")
return self.boundjid.full return self.boundjid.full
@fulljid.setter @fulljid.setter
def fulljid(self, value): def fulljid(self, value):
logging.warning("fulljid property deprecated. Use boundjid.full") log.warning("fulljid property deprecated. Use boundjid.full")
self.boundjid.full = value self.boundjid.full = value
@property @property
@ -472,12 +475,12 @@ class BaseXMPP(XMLStream):
""" """
Attribute accessor for jid resource Attribute accessor for jid resource
""" """
logging.warning("resource property deprecated. Use boundjid.resource") log.warning("resource property deprecated. Use boundjid.resource")
return self.boundjid.resource return self.boundjid.resource
@resource.setter @resource.setter
def resource(self, value): def resource(self, value):
logging.warning("fulljid property deprecated. Use boundjid.full") log.warning("fulljid property deprecated. Use boundjid.full")
self.boundjid.resource = value self.boundjid.resource = value
@property @property
@ -485,12 +488,12 @@ class BaseXMPP(XMLStream):
""" """
Attribute accessor for jid usernode Attribute accessor for jid usernode
""" """
logging.warning("username property deprecated. Use boundjid.user") log.warning("username property deprecated. Use boundjid.user")
return self.boundjid.user return self.boundjid.user
@username.setter @username.setter
def username(self, value): def username(self, value):
logging.warning("username property deprecated. Use boundjid.user") log.warning("username property deprecated. Use boundjid.user")
self.boundjid.user = value self.boundjid.user = value
@property @property
@ -498,17 +501,17 @@ class BaseXMPP(XMLStream):
""" """
Attribute accessor for jid host Attribute accessor for jid host
""" """
logging.warning("server property deprecated. Use boundjid.host") log.warning("server property deprecated. Use boundjid.host")
return self.boundjid.server return self.boundjid.server
@server.setter @server.setter
def server(self, value): def server(self, value):
logging.warning("server property deprecated. Use boundjid.host") log.warning("server property deprecated. Use boundjid.host")
self.boundjid.server = value self.boundjid.server = value
def set_jid(self, jid): def set_jid(self, jid):
"""Rip a JID apart and claim it as our own.""" """Rip a JID apart and claim it as our own."""
logging.debug("setting jid to %s" % jid) log.debug("setting jid to %s" % jid)
self.boundjid.full = jid self.boundjid.full = jid
def getjidresource(self, fulljid): def getjidresource(self, fulljid):
@ -588,7 +591,7 @@ class BaseXMPP(XMLStream):
# disconnects. Determine if this was the last connection # disconnects. Determine if this was the last connection
# for the JID. # for the JID.
if show == 'unavailable': if show == 'unavailable':
logging.debug("%s %s got offline" % (jid, resource)) log.debug("%s %s got offline" % (jid, resource))
del connections[resource] del connections[resource]
if not connections and not self.roster[jid]['in_roster']: if not connections and not self.roster[jid]['in_roster']:
@ -604,7 +607,7 @@ class BaseXMPP(XMLStream):
self.event("changed_status", presence) self.event("changed_status", presence)
if got_online: if got_online:
self.event("got_online", presence) self.event("got_online", presence)
logging.debug("STATUS: %s%s/%s[%s]: %s" % (name, jid, resource, log.debug("STATUS: %s%s/%s[%s]: %s" % (name, jid, resource,
show, status)) show, status))
def _handle_subscribe(self, presence): def _handle_subscribe(self, presence):

View File

@ -32,6 +32,9 @@ except:
SRV_SUPPORT = False SRV_SUPPORT = False
log = logging.getLogger(__name__)
class ClientXMPP(BaseXMPP): class ClientXMPP(BaseXMPP):
""" """
@ -133,7 +136,7 @@ class ClientXMPP(BaseXMPP):
def _session_timeout_check(self): def _session_timeout_check(self):
if not self.session_started_event.isSet(): if not self.session_started_event.isSet():
logging.debug("Session start has taken more than 15 seconds") log.debug("Session start has taken more than 15 seconds")
self.disconnect(reconnect=self.auto_reconnect) self.disconnect(reconnect=self.auto_reconnect)
def connect(self, address=tuple()): def connect(self, address=tuple()):
@ -150,19 +153,19 @@ class ClientXMPP(BaseXMPP):
self.session_started_event.clear() self.session_started_event.clear()
if not address or len(address) < 2: if not address or len(address) < 2:
if not self.srv_support: if not self.srv_support:
logging.debug("Did not supply (address, port) to connect" + \ log.debug("Did not supply (address, port) to connect" + \
" to and no SRV support is installed" + \ " to and no SRV support is installed" + \
" (http://www.dnspython.org)." + \ " (http://www.dnspython.org)." + \
" Continuing to attempt connection, using" + \ " Continuing to attempt connection, using" + \
" server hostname from JID.") " server hostname from JID.")
else: else:
logging.debug("Since no address is supplied," + \ log.debug("Since no address is supplied," + \
"attempting SRV lookup.") "attempting SRV lookup.")
try: try:
xmpp_srv = "_xmpp-client._tcp.%s" % self.server xmpp_srv = "_xmpp-client._tcp.%s" % self.server
answers = dns.resolver.query(xmpp_srv, dns.rdatatype.SRV) answers = dns.resolver.query(xmpp_srv, dns.rdatatype.SRV)
except dns.resolver.NXDOMAIN: except dns.resolver.NXDOMAIN:
logging.debug("No appropriate SRV record found." + \ log.debug("No appropriate SRV record found." + \
" Using JID server name.") " Using JID server name.")
else: else:
# Pick a random server, weighted by priority. # Pick a random server, weighted by priority.
@ -276,7 +279,7 @@ class ClientXMPP(BaseXMPP):
self.send_xml(xml) self.send_xml(xml)
return True return True
else: else:
logging.warning("The module tlslite is required to log in" +\ log.warning("The module tlslite is required to log in" +\
" to some servers, and has not been found.") " to some servers, and has not been found.")
return False return False
@ -286,7 +289,7 @@ class ClientXMPP(BaseXMPP):
Restarts the stream. Restarts the stream.
""" """
logging.debug("Starting TLS") log.debug("Starting TLS")
if self.start_tls(): if self.start_tls():
raise RestartStream() raise RestartStream()
@ -300,7 +303,7 @@ class ClientXMPP(BaseXMPP):
if '{urn:ietf:params:xml:ns:xmpp-tls}starttls' in self.features: if '{urn:ietf:params:xml:ns:xmpp-tls}starttls' in self.features:
return False return False
logging.debug("Starting SASL Auth") log.debug("Starting SASL Auth")
sasl_ns = 'urn:ietf:params:xml:ns:xmpp-sasl' sasl_ns = 'urn:ietf:params:xml:ns:xmpp-sasl'
self.add_handler("<success xmlns='%s' />" % sasl_ns, self.add_handler("<success xmlns='%s' />" % sasl_ns,
self._handle_auth_success, self._handle_auth_success,
@ -334,7 +337,7 @@ class ClientXMPP(BaseXMPP):
sasl_ns, sasl_ns,
'ANONYMOUS')) 'ANONYMOUS'))
else: else:
logging.error("No appropriate login method.") log.error("No appropriate login method.")
self.disconnect() self.disconnect()
return True return True
@ -356,7 +359,7 @@ class ClientXMPP(BaseXMPP):
Arguments: Arguments:
xml -- The SASL authentication failure element. xml -- The SASL authentication failure element.
""" """
logging.info("Authentication failed.") log.info("Authentication failed.")
self.event("failed_auth", direct=True) self.event("failed_auth", direct=True)
self.disconnect() self.disconnect()
@ -367,7 +370,7 @@ class ClientXMPP(BaseXMPP):
Arguments: Arguments:
xml -- The bind feature element. xml -- The bind feature element.
""" """
logging.debug("Requesting resource: %s" % self.boundjid.resource) log.debug("Requesting resource: %s" % self.boundjid.resource)
xml.clear() xml.clear()
iq = self.Iq(stype='set') iq = self.Iq(stype='set')
if self.boundjid.resource: if self.boundjid.resource:
@ -381,10 +384,10 @@ class ClientXMPP(BaseXMPP):
self.set_jid(response.xml.find('{%s}bind/{%s}jid' % (bind_ns, self.set_jid(response.xml.find('{%s}bind/{%s}jid' % (bind_ns,
bind_ns)).text) bind_ns)).text)
self.bound = True self.bound = True
logging.info("Node set to: %s" % self.boundjid.fulljid) log.info("Node set to: %s" % self.boundjid.fulljid)
session_ns = 'urn:ietf:params:xml:ns:xmpp-session' session_ns = 'urn:ietf:params:xml:ns:xmpp-session'
if "{%s}session" % session_ns not in self.features or self.bindfail: if "{%s}session" % session_ns not in self.features or self.bindfail:
logging.debug("Established Session") log.debug("Established Session")
self.sessionstarted = True self.sessionstarted = True
self.session_started_event.set() self.session_started_event.set()
self.event("session_start") self.event("session_start")
@ -399,7 +402,7 @@ class ClientXMPP(BaseXMPP):
if self.authenticated and self.bound: if self.authenticated and self.bound:
iq = self.makeIqSet(xml) iq = self.makeIqSet(xml)
response = iq.send() response = iq.send()
logging.debug("Established Session") log.debug("Established Session")
self.sessionstarted = True self.sessionstarted = True
self.session_started_event.set() self.session_started_event.set()
self.event("session_start") self.event("session_start")

View File

@ -22,6 +22,9 @@ from sleekxmpp.xmlstream.matcher import *
from sleekxmpp.xmlstream.handler import * from sleekxmpp.xmlstream.handler import *
log = logging.getLogger(__name__)
class ComponentXMPP(BaseXMPP): class ComponentXMPP(BaseXMPP):
""" """
@ -82,7 +85,7 @@ class ComponentXMPP(BaseXMPP):
Overrides XMLStream.connect. Overrides XMLStream.connect.
""" """
logging.debug("Connecting to %s:%s" % (self.server_host, log.debug("Connecting to %s:%s" % (self.server_host,
self.server_port)) self.server_port))
return XMLStream.connect(self, self.server_host, return XMLStream.connect(self, self.server_host,
self.server_port) self.server_port)

View File

@ -14,6 +14,9 @@ from .. xmlstream.stanzabase import registerStanzaPlugin, ElementBase, ET, JID
from .. stanza.iq import Iq from .. stanza.iq import Iq
log = logging.getLogger(__name__)
class GmailQuery(ElementBase): class GmailQuery(ElementBase):
namespace = 'google:mail:notify' namespace = 'google:mail:notify'
name = 'query' name = 'query'
@ -118,12 +121,12 @@ class gmail_notify(base.base_plugin):
def handle_gmail(self, iq): def handle_gmail(self, iq):
mailbox = iq['mailbox'] mailbox = iq['mailbox']
approx = ' approximately' if mailbox['estimated'] else '' approx = ' approximately' if mailbox['estimated'] else ''
logging.info('Gmail: Received%s %s emails' % (approx, mailbox['total-matched'])) log.info('Gmail: Received%s %s emails' % (approx, mailbox['total-matched']))
self.last_result_time = mailbox['result-time'] self.last_result_time = mailbox['result-time']
self.xmpp.event('gmail_messages', iq) self.xmpp.event('gmail_messages', iq)
def handle_new_mail(self, iq): def handle_new_mail(self, iq):
logging.info("Gmail: New emails received!") log.info("Gmail: New emails received!")
self.xmpp.event('gmail_notify') self.xmpp.event('gmail_notify')
self.checkEmail() self.checkEmail()
@ -135,9 +138,9 @@ class gmail_notify(base.base_plugin):
def search(self, query=None, newer=None): def search(self, query=None, newer=None):
if query is None: if query is None:
logging.info("Gmail: Checking for new emails") log.info("Gmail: Checking for new emails")
else: else:
logging.info('Gmail: Searching for emails matching: "%s"' % query) log.info('Gmail: Searching for emails matching: "%s"' % query)
iq = self.xmpp.Iq() iq = self.xmpp.Iq()
iq['type'] = 'get' iq['type'] = 'get'
iq['to'] = self.xmpp.jid iq['to'] = self.xmpp.jid

View File

@ -3,6 +3,10 @@ import logging
from xml.etree import cElementTree as ET from xml.etree import cElementTree as ET
import types import types
log = logging.getLogger(__name__)
class jobs(base.base_plugin): class jobs(base.base_plugin):
def plugin_init(self): def plugin_init(self):
self.xep = 'pubsubjob' self.xep = 'pubsubjob'
@ -40,7 +44,7 @@ class jobs(base.base_plugin):
iq['psstate']['payload'] = state iq['psstate']['payload'] = state
result = iq.send() result = iq.send()
if result is None or type(result) == types.BooleanType or result['type'] != 'result': if result is None or type(result) == types.BooleanType or result['type'] != 'result':
logging.error("Unable to change %s:%s to %s" % (node, jobid, state)) log.error("Unable to change %s:%s to %s" % (node, jobid, state))
return False return False
return True return True

View File

@ -6,12 +6,16 @@
See the file LICENSE for copying permission. See the file LICENSE for copying permission.
""" """
from . import base from . import base
import logging import log
from xml.etree import cElementTree as ET from xml.etree import cElementTree as ET
import copy import copy
import logging import logging
#TODO support item groups and results #TODO support item groups and results
log = logging.getLogger(__name__)
class old_0004(base.base_plugin): class old_0004(base.base_plugin):
def plugin_init(self): def plugin_init(self):
@ -22,7 +26,7 @@ class old_0004(base.base_plugin):
def post_init(self): def post_init(self):
base.base_plugin.post_init(self) base.base_plugin.post_init(self)
self.xmpp.plugin['xep_0030'].add_feature('jabber:x:data') self.xmpp.plugin['xep_0030'].add_feature('jabber:x:data')
logging.warning("This implementation of XEP-0004 is deprecated.") log.warning("This implementation of XEP-0004 is deprecated.")
def handler_message_xform(self, xml): def handler_message_xform(self, xml):
object = self.handle_form(xml) object = self.handle_form(xml)

View File

@ -16,6 +16,9 @@ from .. stanza.message import Message
import types import types
log = logging.getLogger(__name__)
class Form(ElementBase): class Form(ElementBase):
namespace = 'jabber:x:data' namespace = 'jabber:x:data'
name = 'x' name = 'x'
@ -55,11 +58,11 @@ class Form(ElementBase):
return field return field
def getXML(self, type='submit'): def getXML(self, type='submit'):
logging.warning("Form.getXML() is deprecated API compatibility with plugins/old_0004.py") log.warning("Form.getXML() is deprecated API compatibility with plugins/old_0004.py")
return self.xml return self.xml
def fromXML(self, xml): def fromXML(self, xml):
logging.warning("Form.fromXML() is deprecated API compatibility with plugins/old_0004.py") log.warning("Form.fromXML() is deprecated API compatibility with plugins/old_0004.py")
n = Form(xml=xml) n = Form(xml=xml)
return n return n

View File

@ -16,6 +16,9 @@ from .. xmlstream.matcher.xpath import MatchXPath
from .. xmlstream import ElementBase, ET, JID, register_stanza_plugin from .. xmlstream import ElementBase, ET, JID, register_stanza_plugin
log = logging.getLogger(__name__)
class LastActivity(ElementBase): class LastActivity(ElementBase):
name = 'query' name = 'query'
namespace = 'jabber:iq:last' namespace = 'jabber:iq:last'
@ -68,10 +71,10 @@ class xep_0012(base.base_plugin):
def handle_last_activity_query(self, iq): def handle_last_activity_query(self, iq):
if iq['type'] == 'get': if iq['type'] == 'get':
logging.debug("Last activity requested by %s" % iq['from']) log.debug("Last activity requested by %s" % iq['from'])
self.xmpp.event('last_activity_request', iq) self.xmpp.event('last_activity_request', iq)
elif iq['type'] == 'result': elif iq['type'] == 'result':
logging.debug("Last activity result from %s" % iq['from']) log.debug("Last activity result from %s" % iq['from'])
self.xmpp.event('last_activity', iq) self.xmpp.event('last_activity', iq)
def handle_last_activity(self, iq): def handle_last_activity(self, iq):

View File

@ -13,6 +13,10 @@ from .. xmlstream.matcher.xpath import MatchXPath
from .. xmlstream.stanzabase import registerStanzaPlugin, ElementBase, ET, JID from .. xmlstream.stanzabase import registerStanzaPlugin, ElementBase, ET, JID
from .. stanza.iq import Iq from .. stanza.iq import Iq
log = logging.getLogger(__name__)
class DiscoInfo(ElementBase): class DiscoInfo(ElementBase):
namespace = 'http://jabber.org/protocol/disco#info' namespace = 'http://jabber.org/protocol/disco#info'
name = 'query' name = 'query'
@ -222,18 +226,18 @@ class xep_0030(base.base_plugin):
def handle_item_query(self, iq): def handle_item_query(self, iq):
if iq['type'] == 'get': if iq['type'] == 'get':
logging.debug("Items requested by %s" % iq['from']) log.debug("Items requested by %s" % iq['from'])
self.xmpp.event('disco_items_request', iq) self.xmpp.event('disco_items_request', iq)
elif iq['type'] == 'result': elif iq['type'] == 'result':
logging.debug("Items result from %s" % iq['from']) log.debug("Items result from %s" % iq['from'])
self.xmpp.event('disco_items', iq) self.xmpp.event('disco_items', iq)
def handle_info_query(self, iq): def handle_info_query(self, iq):
if iq['type'] == 'get': if iq['type'] == 'get':
logging.debug("Info requested by %s" % iq['from']) log.debug("Info requested by %s" % iq['from'])
self.xmpp.event('disco_info_request', iq) self.xmpp.event('disco_info_request', iq)
elif iq['type'] == 'result': elif iq['type'] == 'result':
logging.debug("Info result from %s" % iq['from']) log.debug("Info result from %s" % iq['from'])
self.xmpp.event('disco_info', iq) self.xmpp.event('disco_info', iq)
def handle_disco_info(self, iq, forwarded=False): def handle_disco_info(self, iq, forwarded=False):
@ -248,13 +252,13 @@ class xep_0030(base.base_plugin):
if not node_name: if not node_name:
node_name = 'main' node_name = 'main'
logging.debug("Using default handler for disco#info on node '%s'." % node_name) log.debug("Using default handler for disco#info on node '%s'." % node_name)
if node_name in self.nodes: if node_name in self.nodes:
node = self.nodes[node_name] node = self.nodes[node_name]
iq.reply().setPayload(node.info.xml).send() iq.reply().setPayload(node.info.xml).send()
else: else:
logging.debug("Node %s requested, but does not exist." % node_name) log.debug("Node %s requested, but does not exist." % node_name)
iq.reply().error().setPayload(iq['disco_info'].xml) iq.reply().error().setPayload(iq['disco_info'].xml)
iq['error']['code'] = '404' iq['error']['code'] = '404'
iq['error']['type'] = 'cancel' iq['error']['type'] = 'cancel'
@ -276,13 +280,13 @@ class xep_0030(base.base_plugin):
if not node_name: if not node_name:
node_name = 'main' node_name = 'main'
logging.debug("Using default handler for disco#items on node '%s'." % node_name) log.debug("Using default handler for disco#items on node '%s'." % node_name)
if node_name in self.nodes: if node_name in self.nodes:
node = self.nodes[node_name] node = self.nodes[node_name]
iq.reply().setPayload(node.items.xml).send() iq.reply().setPayload(node.items.xml).send()
else: else:
logging.debug("Node %s requested, but does not exist." % node_name) log.debug("Node %s requested, but does not exist." % node_name)
iq.reply().error().setPayload(iq['disco_items'].xml) iq.reply().error().setPayload(iq['disco_items'].xml)
iq['error']['code'] = '404' iq['error']['code'] = '404'
iq['error']['type'] = 'cancel' iq['error']['type'] = 'cancel'

View File

@ -15,6 +15,10 @@ from .. xmlstream.handler.callback import Callback
from .. xmlstream.matcher.xpath import MatchXPath from .. xmlstream.matcher.xpath import MatchXPath
from .. xmlstream.matcher.xmlmask import MatchXMLMask from .. xmlstream.matcher.xmlmask import MatchXMLMask
log = logging.getLogger(__name__)
class MUCPresence(ElementBase): class MUCPresence(ElementBase):
name = 'x' name = 'x'
namespace = 'http://jabber.org/protocol/muc#user' namespace = 'http://jabber.org/protocol/muc#user'
@ -87,19 +91,19 @@ class MUCPresence(ElementBase):
return self.parent()['from'].bare return self.parent()['from'].bare
def setNick(self, value): def setNick(self, value):
logging.warning("Cannot set nick through mucpresence plugin.") log.warning("Cannot set nick through mucpresence plugin.")
return self return self
def setRoom(self, value): def setRoom(self, value):
logging.warning("Cannot set room through mucpresence plugin.") log.warning("Cannot set room through mucpresence plugin.")
return self return self
def delNick(self): def delNick(self):
logging.warning("Cannot delete nick through mucpresence plugin.") log.warning("Cannot delete nick through mucpresence plugin.")
return self return self
def delRoom(self): def delRoom(self):
logging.warning("Cannot delete room through mucpresence plugin.") log.warning("Cannot delete room through mucpresence plugin.")
return self return self
class xep_0045(base.base_plugin): class xep_0045(base.base_plugin):
@ -135,7 +139,7 @@ class xep_0045(base.base_plugin):
if entry['nick'] not in self.rooms[entry['room']]: if entry['nick'] not in self.rooms[entry['room']]:
got_online = True got_online = True
self.rooms[entry['room']][entry['nick']] = entry self.rooms[entry['room']][entry['nick']] = entry
logging.debug("MUC presence from %s/%s : %s" % (entry['room'],entry['nick'], entry)) log.debug("MUC presence from %s/%s : %s" % (entry['room'],entry['nick'], entry))
self.xmpp.event("groupchat_presence", pr) self.xmpp.event("groupchat_presence", pr)
self.xmpp.event("muc::%s::presence" % entry['room'], pr) self.xmpp.event("muc::%s::presence" % entry['room'], pr)
if got_offline: if got_offline:

View File

@ -6,6 +6,10 @@ from .. xmlstream.stanzabase import registerStanzaPlugin, ElementBase, ET
from . import stanza_pubsub from . import stanza_pubsub
from . xep_0004 import Form from . xep_0004 import Form
log = logging.getLogger(__name__)
class xep_0060(base.base_plugin): class xep_0060(base.base_plugin):
""" """
XEP-0060 Publish Subscribe XEP-0060 Publish Subscribe
@ -110,14 +114,14 @@ class xep_0060(base.base_plugin):
#self.xmpp.add_handler("<iq id='%s'/>" % id, self.handlerCreateNodeResponse) #self.xmpp.add_handler("<iq id='%s'/>" % id, self.handlerCreateNodeResponse)
result = iq.send() result = iq.send()
if result is None or result == False or result['type'] == 'error': if result is None or result == False or result['type'] == 'error':
logging.warning("got error instead of config") log.warning("got error instead of config")
return False return False
if node is not None: if node is not None:
form = result.find('{http://jabber.org/protocol/pubsub#owner}pubsub/{http://jabber.org/protocol/pubsub#owner}configure/{jabber:x:data}x') form = result.find('{http://jabber.org/protocol/pubsub#owner}pubsub/{http://jabber.org/protocol/pubsub#owner}configure/{jabber:x:data}x')
else: else:
form = result.find('{http://jabber.org/protocol/pubsub#owner}pubsub/{http://jabber.org/protocol/pubsub#owner}default/{jabber:x:data}x') form = result.find('{http://jabber.org/protocol/pubsub#owner}pubsub/{http://jabber.org/protocol/pubsub#owner}default/{jabber:x:data}x')
if not form or form is None: if not form or form is None:
logging.error("No form found.") log.error("No form found.")
return False return False
return Form(xml=form) return Form(xml=form)
@ -133,7 +137,7 @@ class xep_0060(base.base_plugin):
id = iq['id'] id = iq['id']
result = iq.send() result = iq.send()
if result is None or result == False or result['type'] == 'error': if result is None or result == False or result['type'] == 'error':
logging.warning("got error instead of config") log.warning("got error instead of config")
return False return False
else: else:
results = result.findall('{http://jabber.org/protocol/pubsub#owner}pubsub/{http://jabber.org/protocol/pubsub#owner}subscriptions/{http://jabber.org/protocol/pubsub#owner}subscription') results = result.findall('{http://jabber.org/protocol/pubsub#owner}pubsub/{http://jabber.org/protocol/pubsub#owner}subscriptions/{http://jabber.org/protocol/pubsub#owner}subscription')
@ -156,7 +160,7 @@ class xep_0060(base.base_plugin):
id = iq['id'] id = iq['id']
result = iq.send() result = iq.send()
if result is None or result == False or result['type'] == 'error': if result is None or result == False or result['type'] == 'error':
logging.warning("got error instead of config") log.warning("got error instead of config")
return False return False
else: else:
results = result.findall('{http://jabber.org/protocol/pubsub#owner}pubsub/{http://jabber.org/protocol/pubsub#owner}affiliations/{http://jabber.org/protocol/pubsub#owner}affiliation') results = result.findall('{http://jabber.org/protocol/pubsub#owner}pubsub/{http://jabber.org/protocol/pubsub#owner}affiliations/{http://jabber.org/protocol/pubsub#owner}affiliation')
@ -264,7 +268,7 @@ class xep_0060(base.base_plugin):
try: try:
config.field['pubsub#collection'].setValue(parent) config.field['pubsub#collection'].setValue(parent)
except KeyError: except KeyError:
logging.warning("pubsub#collection doesn't exist in config, trying to add it") log.warning("pubsub#collection doesn't exist in config, trying to add it")
config.addField('pubsub#collection', value=parent) config.addField('pubsub#collection', value=parent)
if not self.setNodeConfig(jid, child, config): if not self.setNodeConfig(jid, child, config):
return False return False
@ -298,7 +302,7 @@ class xep_0060(base.base_plugin):
try: try:
config.field['pubsub#collection'].setValue(parent) config.field['pubsub#collection'].setValue(parent)
except KeyError: except KeyError:
logging.warning("pubsub#collection doesn't exist in config, trying to add it") log.warning("pubsub#collection doesn't exist in config, trying to add it")
config.addField('pubsub#collection', value=parent) config.addField('pubsub#collection', value=parent)
if not self.setNodeConfig(jid, child, config): if not self.setNodeConfig(jid, child, config):
return False return False

View File

@ -12,6 +12,9 @@ import hashlib
from . import base from . import base
log = logging.getLogger(__name__)
class xep_0078(base.base_plugin): class xep_0078(base.base_plugin):
""" """
XEP-0078 NON-SASL Authentication XEP-0078 NON-SASL Authentication
@ -30,7 +33,7 @@ class xep_0078(base.base_plugin):
self.auth() self.auth()
def auth(self, xml=None): def auth(self, xml=None):
logging.debug("Starting jabber:iq:auth Authentication") log.debug("Starting jabber:iq:auth Authentication")
auth_request = self.xmpp.makeIqGet() auth_request = self.xmpp.makeIqGet()
auth_request_query = ET.Element('{jabber:iq:auth}query') auth_request_query = ET.Element('{jabber:iq:auth}query')
auth_request.attrib['to'] = self.xmpp.server auth_request.attrib['to'] = self.xmpp.server
@ -47,12 +50,12 @@ class xep_0078(base.base_plugin):
query.append(username) query.append(username)
query.append(resource) query.append(resource)
if rquery.find('{jabber:iq:auth}digest') is None: if rquery.find('{jabber:iq:auth}digest') is None:
logging.warning("Authenticating via jabber:iq:auth Plain.") log.warning("Authenticating via jabber:iq:auth Plain.")
password = ET.Element('password') password = ET.Element('password')
password.text = self.xmpp.password password.text = self.xmpp.password
query.append(password) query.append(password)
else: else:
logging.debug("Authenticating via jabber:iq:auth Digest") log.debug("Authenticating via jabber:iq:auth Digest")
digest = ET.Element('digest') digest = ET.Element('digest')
digest.text = hashlib.sha1(b"%s%s" % (self.streamid, self.xmpp.password)).hexdigest() digest.text = hashlib.sha1(b"%s%s" % (self.streamid, self.xmpp.password)).hexdigest()
query.append(digest) query.append(digest)
@ -64,6 +67,6 @@ class xep_0078(base.base_plugin):
self.xmpp.sessionstarted = True self.xmpp.sessionstarted = True
self.xmpp.event("session_start") self.xmpp.event("session_start")
else: else:
logging.info("Authentication failed") log.info("Authentication failed")
self.xmpp.disconnect() self.xmpp.disconnect()
self.xmpp.event("failed_auth") self.xmpp.event("failed_auth")

View File

@ -14,6 +14,9 @@ from .. xmlstream.stanzabase import registerStanzaPlugin, ElementBase, ET, JID
from .. stanza.message import Message from .. stanza.message import Message
log = logging.getLogger(__name__)
class ChatState(ElementBase): class ChatState(ElementBase):
namespace = 'http://jabber.org/protocol/chatstates' namespace = 'http://jabber.org/protocol/chatstates'
plugin_attrib = 'chat_state' plugin_attrib = 'chat_state'
@ -97,5 +100,5 @@ class xep_0085(base.base_plugin):
def _handleChatState(self, msg): def _handleChatState(self, msg):
state = msg['chat_state'].name state = msg['chat_state'].name
logging.debug("Chat State: %s, %s" % (state, msg['from'].jid)) log.debug("Chat State: %s, %s" % (state, msg['from'].jid))
self.xmpp.event('chatstate_%s' % state, msg) self.xmpp.event('chatstate_%s' % state, msg)

View File

@ -10,6 +10,10 @@ from . import base
import time import time
import logging import logging
log = logging.getLogger(__name__)
class xep_0199(base.base_plugin): class xep_0199(base.base_plugin):
"""XEP-0199 XMPP Ping""" """XEP-0199 XMPP Ping"""
@ -30,7 +34,7 @@ class xep_0199(base.base_plugin):
time.sleep(self.config.get('frequency', 300)) time.sleep(self.config.get('frequency', 300))
while self.sendPing(self.xmpp.server, self.config.get('timeout', 30)) is not False: while self.sendPing(self.xmpp.server, self.config.get('timeout', 30)) is not False:
time.sleep(self.config.get('frequency', 300)) time.sleep(self.config.get('frequency', 300))
logging.debug("Did not recieve ping back in time. Requesting Reconnect.") log.debug("Did not recieve ping back in time. Requesting Reconnect.")
self.xmpp.disconnect(reconnect=True) self.xmpp.disconnect(reconnect=True)
def handler_ping(self, xml): def handler_ping(self, xml):

View File

@ -17,6 +17,9 @@ from .. xmlstream.matcher.xpath import MatchXPath
from .. xmlstream import ElementBase, ET, JID, register_stanza_plugin from .. xmlstream import ElementBase, ET, JID, register_stanza_plugin
log = logging.getLogger(__name__)
class EntityTime(ElementBase): class EntityTime(ElementBase):
name = 'time' name = 'time'
namespace = 'urn:xmpp:time' namespace = 'urn:xmpp:time'
@ -84,10 +87,10 @@ class xep_0202(base.base_plugin):
def handle_entity_time_query(self, iq): def handle_entity_time_query(self, iq):
if iq['type'] == 'get': if iq['type'] == 'get':
logging.debug("Entity time requested by %s" % iq['from']) log.debug("Entity time requested by %s" % iq['from'])
self.xmpp.event('entity_time_request', iq) self.xmpp.event('entity_time_request', iq)
elif iq['type'] == 'result': elif iq['type'] == 'result':
logging.debug("Entity time result from %s" % iq['from']) log.debug("Entity time result from %s" % iq['from'])
self.xmpp.event('entity_time', iq) self.xmpp.event('entity_time', iq)
def handle_entity_time(self, iq): def handle_entity_time(self, iq):

View File

@ -15,6 +15,9 @@ from sleekxmpp.stanza import Error
from sleekxmpp.xmlstream import ET, StanzaBase, register_stanza_plugin from sleekxmpp.xmlstream import ET, StanzaBase, register_stanza_plugin
log = logging.getLogger(__name__)
class RootStanza(StanzaBase): class RootStanza(StanzaBase):
""" """
@ -58,7 +61,7 @@ class RootStanza(StanzaBase):
self['error']['text'] = "SleekXMPP got into trouble." self['error']['text'] = "SleekXMPP got into trouble."
else: else:
self['error']['text'] = traceback.format_tb(e.__traceback__) self['error']['text'] = traceback.format_tb(e.__traceback__)
logging.exception('Error handling {%s}%s stanza' % log.exception('Error handling {%s}%s stanza' %
(self.namespace, self.name)) (self.namespace, self.name))
self.send() self.send()

View File

@ -86,7 +86,7 @@ class StateMachine(object):
while not self.lock.acquire(False): while not self.lock.acquire(False):
time.sleep(.001) time.sleep(.001)
if (start + wait - time.time()) <= 0.0: if (start + wait - time.time()) <= 0.0:
logging.debug("Could not acquire lock") log.debug("Could not acquire lock")
return False return False
while not self.__current_state in from_states: while not self.__current_state in from_states:
@ -95,7 +95,7 @@ class StateMachine(object):
if remainder > 0: if remainder > 0:
self.notifier.wait(remainder) self.notifier.wait(remainder)
else: else:
logging.debug("State was not ready") log.debug("State was not ready")
self.lock.release() self.lock.release()
return False return False

View File

@ -16,6 +16,9 @@ from sleekxmpp.xmlstream import StanzaBase, RESPONSE_TIMEOUT
from sleekxmpp.xmlstream.handler.base import BaseHandler from sleekxmpp.xmlstream.handler.base import BaseHandler
log = logging.getLogger(__name__)
class Waiter(BaseHandler): class Waiter(BaseHandler):
""" """
@ -85,7 +88,7 @@ class Waiter(BaseHandler):
stanza = self._payload.get(True, timeout) stanza = self._payload.get(True, timeout)
except queue.Empty: except queue.Empty:
stanza = False stanza = False
logging.warning("Timed out waiting for %s" % self.name) log.warning("Timed out waiting for %s" % self.name)
self.stream.removeHandler(self.name) self.stream.removeHandler(self.name)
return stanza return stanza

View File

@ -6,6 +6,8 @@
See the file LICENSE for copying permission. See the file LICENSE for copying permission.
""" """
import logging
from xml.parsers.expat import ExpatError from xml.parsers.expat import ExpatError
from sleekxmpp.xmlstream.stanzabase import ET from sleekxmpp.xmlstream.stanzabase import ET
@ -18,6 +20,9 @@ from sleekxmpp.xmlstream.matcher.base import MatcherBase
IGNORE_NS = False IGNORE_NS = False
log = logging.getLogger(__name__)
class MatchXMLMask(MatcherBase): class MatchXMLMask(MatcherBase):
""" """
@ -97,8 +102,7 @@ class MatchXMLMask(MatcherBase):
try: try:
mask = ET.fromstring(mask) mask = ET.fromstring(mask)
except ExpatError: except ExpatError:
logging.log(logging.WARNING, log.warning("Expat error: %s\nIn parsing: %s" % ('', mask))
"Expat error: %s\nIn parsing: %s" % ('', mask))
if not use_ns: if not use_ns:
# Compare the element without using namespaces. # Compare the element without using namespaces.

View File

@ -15,6 +15,9 @@ except ImportError:
import Queue as queue import Queue as queue
log = logging.getLogger(__name__)
class Task(object): class Task(object):
""" """
@ -168,13 +171,13 @@ class Scheduler(object):
except KeyboardInterrupt: except KeyboardInterrupt:
self.run = False self.run = False
if self.parentstop is not None: if self.parentstop is not None:
logging.debug("stopping parent") log.debug("stopping parent")
self.parentstop.set() self.parentstop.set()
except SystemExit: except SystemExit:
self.run = False self.run = False
if self.parentstop is not None: if self.parentstop is not None:
self.parentstop.set() self.parentstop.set()
logging.debug("Quitting Scheduler thread") log.debug("Quitting Scheduler thread")
if self.parentqueue is not None: if self.parentqueue is not None:
self.parentqueue.put(('quit', None, None)) self.parentqueue.put(('quit', None, None))

View File

@ -16,6 +16,9 @@ from sleekxmpp.xmlstream import JID
from sleekxmpp.xmlstream.tostring import tostring from sleekxmpp.xmlstream.tostring import tostring
log = logging.getLogger(__name__)
# Used to check if an argument is an XML object. # Used to check if an argument is an XML object.
XML_TYPE = type(ET.Element('xml')) XML_TYPE = type(ET.Element('xml'))
@ -1140,7 +1143,7 @@ class StanzaBase(ElementBase):
Meant to be overridden. Meant to be overridden.
""" """
logging.exception('Error handling {%s}%s stanza' % (self.namespace, log.exception('Error handling {%s}%s stanza' % (self.namespace,
self.name)) self.name))
def send(self): def send(self):

View File

@ -44,6 +44,9 @@ HANDLER_THREADS = 1
SSL_SUPPORT = True SSL_SUPPORT = True
log = logging.getLogger(__name__)
class RestartStream(Exception): class RestartStream(Exception):
""" """
Exception to restart stream processing, including Exception to restart stream processing, including
@ -206,7 +209,7 @@ class XMLStream(object):
# Used in Windows # Used in Windows
signal.signal(signal.SIGTERM, self._handle_kill) signal.signal(signal.SIGTERM, self._handle_kill)
except: except:
logging.debug("Can not set interrupt signal handlers. " + \ log.debug("Can not set interrupt signal handlers. " + \
"SleekXMPP is not running from a main thread.") "SleekXMPP is not running from a main thread.")
def _handle_kill(self, signum, frame): def _handle_kill(self, signum, frame):
@ -275,7 +278,7 @@ class XMLStream(object):
self.socket = self.socket_class(Socket.AF_INET, Socket.SOCK_STREAM) self.socket = self.socket_class(Socket.AF_INET, Socket.SOCK_STREAM)
self.socket.settimeout(None) self.socket.settimeout(None)
if self.use_ssl and self.ssl_support: if self.use_ssl and self.ssl_support:
logging.debug("Socket Wrapped for SSL") log.debug("Socket Wrapped for SSL")
ssl_socket = ssl.wrap_socket(self.socket) ssl_socket = ssl.wrap_socket(self.socket)
if hasattr(self.socket, 'socket'): if hasattr(self.socket, 'socket'):
# We are using a testing socket, so preserve the top # We are using a testing socket, so preserve the top
@ -285,7 +288,7 @@ class XMLStream(object):
self.socket = ssl_socket self.socket = ssl_socket
try: try:
logging.debug("Connecting to %s:%s" % self.address) log.debug("Connecting to %s:%s" % self.address)
self.socket.connect(self.address) self.socket.connect(self.address)
self.set_socket(self.socket, ignore=True) self.set_socket(self.socket, ignore=True)
#this event is where you should set your application state #this event is where you should set your application state
@ -293,7 +296,7 @@ class XMLStream(object):
return True return True
except Socket.error as serr: except Socket.error as serr:
error_msg = "Could not connect to %s:%s. Socket Error #%s: %s" error_msg = "Could not connect to %s:%s. Socket Error #%s: %s"
logging.error(error_msg % (self.address[0], self.address[1], log.error(error_msg % (self.address[0], self.address[1],
serr.errno, serr.strerror)) serr.errno, serr.strerror))
time.sleep(1) time.sleep(1)
return False return False
@ -338,10 +341,10 @@ class XMLStream(object):
""" """
Reset the stream's state and reconnect to the server. Reset the stream's state and reconnect to the server.
""" """
logging.debug("reconnecting...") log.debug("reconnecting...")
self.state.transition('connected', 'disconnected', wait=2.0, self.state.transition('connected', 'disconnected', wait=2.0,
func=self._disconnect, args=(True,)) func=self._disconnect, args=(True,))
logging.debug("connecting...") log.debug("connecting...")
return self.state.transition('disconnected', 'connected', return self.state.transition('disconnected', 'connected',
wait=2.0, func=self._connect) wait=2.0, func=self._connect)
@ -378,8 +381,8 @@ class XMLStream(object):
to be restarted. to be restarted.
""" """
if self.ssl_support: if self.ssl_support:
logging.info("Negotiating TLS") log.info("Negotiating TLS")
logging.info("Using SSL version: %s" % str(self.ssl_version)) log.info("Using SSL version: %s" % str(self.ssl_version))
ssl_socket = ssl.wrap_socket(self.socket, ssl_socket = ssl.wrap_socket(self.socket,
ssl_version=self.ssl_version, ssl_version=self.ssl_version,
do_handshake_on_connect=False) do_handshake_on_connect=False)
@ -393,7 +396,7 @@ class XMLStream(object):
self.set_socket(self.socket) self.set_socket(self.socket)
return True return True
else: else:
logging.warning("Tried to enable TLS, but ssl module not found.") log.warning("Tried to enable TLS, but ssl module not found.")
return False return False
def start_stream_handler(self, xml): def start_stream_handler(self, xml):
@ -557,7 +560,7 @@ class XMLStream(object):
handler[0](copy.copy(data)) handler[0](copy.copy(data))
except Exception as e: except Exception as e:
error_msg = 'Error processing event handler: %s' error_msg = 'Error processing event handler: %s'
logging.exception(error_msg % str(handler[0])) log.exception(error_msg % str(handler[0]))
if hasattr(data, 'exception'): if hasattr(data, 'exception'):
data.exception(e) data.exception(e)
else: else:
@ -622,7 +625,7 @@ class XMLStream(object):
mask = mask.xml mask = mask.xml
data = str(data) data = str(data)
if mask is not None: if mask is not None:
logging.warning("Use of send mask waiters is deprecated.") log.warning("Use of send mask waiters is deprecated.")
wait_for = Waiter("SendWait_%s" % self.new_id(), wait_for = Waiter("SendWait_%s" % self.new_id(),
MatchXMLMask(mask)) MatchXMLMask(mask))
self.register_handler(wait_for) self.register_handler(wait_for)
@ -679,7 +682,7 @@ class XMLStream(object):
self.__thread[name].start() self.__thread[name].start()
for t in range(0, HANDLER_THREADS): for t in range(0, HANDLER_THREADS):
logging.debug("Starting HANDLER THREAD") log.debug("Starting HANDLER THREAD")
start_thread('stream_event_handler_%s' % t, self._event_runner) start_thread('stream_event_handler_%s' % t, self._event_runner)
start_thread('send_thread', self._send_thread) start_thread('send_thread', self._send_thread)
@ -717,16 +720,16 @@ class XMLStream(object):
if self.is_client: if self.is_client:
self.send_raw(self.stream_header) self.send_raw(self.stream_header)
except KeyboardInterrupt: except KeyboardInterrupt:
logging.debug("Keyboard Escape Detected in _process") log.debug("Keyboard Escape Detected in _process")
self.stop.set() self.stop.set()
except SystemExit: except SystemExit:
logging.debug("SystemExit in _process") log.debug("SystemExit in _process")
self.stop.set() self.stop.set()
except Socket.error: except Socket.error:
logging.exception('Socket Error') log.exception('Socket Error')
except: except:
if not self.stop.isSet(): if not self.stop.isSet():
logging.exception('Connection error.') log.exception('Connection error.')
if not self.stop.isSet() and self.auto_reconnect: if not self.stop.isSet() and self.auto_reconnect:
self.reconnect() self.reconnect()
else: else:
@ -756,7 +759,7 @@ class XMLStream(object):
if depth == 0: if depth == 0:
# The stream's root element has closed, # The stream's root element has closed,
# terminating the stream. # terminating the stream.
logging.debug("End of stream recieved") log.debug("End of stream recieved")
self.stream_end_event.set() self.stream_end_event.set()
return False return False
elif depth == 1: elif depth == 1:
@ -770,7 +773,7 @@ class XMLStream(object):
# Keep the root element empty of children to # Keep the root element empty of children to
# save on memory use. # save on memory use.
root.clear() root.clear()
logging.debug("Ending read XML loop") log.debug("Ending read XML loop")
def _build_stanza(self, xml, default_ns=None): def _build_stanza(self, xml, default_ns=None):
""" """
@ -803,7 +806,7 @@ class XMLStream(object):
Arguments: Arguments:
xml -- The XML stanza to analyze. xml -- The XML stanza to analyze.
""" """
logging.debug("RECV: %s" % tostring(xml, log.debug("RECV: %s" % tostring(xml,
xmlns=self.default_ns, xmlns=self.default_ns,
stream=self)) stream=self))
# Apply any preprocessing filters. # Apply any preprocessing filters.
@ -852,7 +855,7 @@ class XMLStream(object):
func(*args) func(*args)
except Exception as e: except Exception as e:
error_msg = 'Error processing event handler: %s' error_msg = 'Error processing event handler: %s'
logging.exception(error_msg % str(func)) log.exception(error_msg % str(func))
if hasattr(args[0], 'exception'): if hasattr(args[0], 'exception'):
args[0].exception(e) args[0].exception(e)
@ -865,7 +868,7 @@ class XMLStream(object):
Stream event handlers will all execute in this thread. Custom event Stream event handlers will all execute in this thread. Custom event
handlers may be spawned in individual threads. handlers may be spawned in individual threads.
""" """
logging.debug("Loading event runner") log.debug("Loading event runner")
try: try:
while not self.stop.isSet(): while not self.stop.isSet():
try: try:
@ -883,14 +886,14 @@ class XMLStream(object):
handler.run(args[0]) handler.run(args[0])
except Exception as e: except Exception as e:
error_msg = 'Error processing stream handler: %s' error_msg = 'Error processing stream handler: %s'
logging.exception(error_msg % handler.name) log.exception(error_msg % handler.name)
args[0].exception(e) args[0].exception(e)
elif etype == 'schedule': elif etype == 'schedule':
try: try:
logging.debug(args) log.debug(args)
handler(*args[0]) handler(*args[0])
except: except:
logging.exception('Error processing scheduled task') log.exception('Error processing scheduled task')
elif etype == 'event': elif etype == 'event':
func, threaded, disposable = handler func, threaded, disposable = handler
try: try:
@ -904,14 +907,14 @@ class XMLStream(object):
func(*args) func(*args)
except Exception as e: except Exception as e:
error_msg = 'Error processing event handler: %s' error_msg = 'Error processing event handler: %s'
logging.exception(error_msg % str(func)) log.exception(error_msg % str(func))
if hasattr(args[0], 'exception'): if hasattr(args[0], 'exception'):
args[0].exception(e) args[0].exception(e)
elif etype == 'quit': elif etype == 'quit':
logging.debug("Quitting event runner thread") log.debug("Quitting event runner thread")
return False return False
except KeyboardInterrupt: except KeyboardInterrupt:
logging.debug("Keyboard Escape Detected in _event_runner") log.debug("Keyboard Escape Detected in _event_runner")
self.disconnect() self.disconnect()
return return
except SystemExit: except SystemExit:
@ -929,14 +932,14 @@ class XMLStream(object):
data = self.send_queue.get(True, 1) data = self.send_queue.get(True, 1)
except queue.Empty: except queue.Empty:
continue continue
logging.debug("SEND: %s" % data) log.debug("SEND: %s" % data)
try: try:
self.socket.send(data.encode('utf-8')) self.socket.send(data.encode('utf-8'))
except: except:
logging.warning("Failed to send %s" % data) log.warning("Failed to send %s" % data)
self.disconnect(self.auto_reconnect) self.disconnect(self.auto_reconnect)
except KeyboardInterrupt: except KeyboardInterrupt:
logging.debug("Keyboard Escape Detected in _send_thread") log.debug("Keyboard Escape Detected in _send_thread")
self.disconnect() self.disconnect()
return return
except SystemExit: except SystemExit: