from weakref import WeakValueDictionary
import content
+from session import SessionCloseError
logger = logging.getLogger('ncclient.listeners')
-session_listeners = {}
+################################################################################
+
+session_listeners = WeakValueDictionary
def session_listener_factory(session):
try:
return session_listeners[session]
session_listeners[session] = SessionListener()
return session_listeners[session]
-class SessionListener(object):
+class SessionListener:
def __init__(self):
self._id2rpc = WeakValueDictionary()
def __str__(self):
return 'SessionListener'
-
-
def expect_close(self):
self._expecting_close = True
logger.warning(e)
def error(self, err):
- from ssh import SessionCloseError
if err is SessionCloseError:
- logger.debug('received session close, expecting_close=%s' %
+ logger.debug('session closed by remote endpoint, expecting_close=%s' %
self._expecting_close)
if not self._expecting_close:
raise err
+################################################################################
class HelloListener:
def __init__(self, session):
self._session = session
+ ### Events
+
def reply(self, data):
try:
id, capabilities = content.Hello.parse(data)
def error(self, err):
self._session.initialize_error(err)
+################################################################################
class DebugListener:
-
- def __str__(self):
- return 'DebugListener'
-
- def reply(self, raw):
- logger.debug('DebugListener:reply:\n%s' % raw)
-
- def error(self, err):
- logger.debug('DebugListener:error:\n%s' % err)
\ No newline at end of file
+ def __str__(self): return 'DebugListener'
+ def reply(self, raw): logger.debug('DebugListener:reply:\n%s' % raw)
+ def error(self, err): logger.debug('DebugListener:error:\n%s' % err)
import content
from capabilities import Capabilities, CAPABILITIES
from error import ClientError
+from listeners import HelloListener
from subject import Subject
logger = logging.getLogger('ncclient.session')
def __init__(self):
Thread.__init__(self, name='session')
- Subject.__init__(self, listeners=[HelloListener(self)])
+ Subject.__init__(self)
self._client_capabilities = CAPABILITIES
self._server_capabilities = None # yet
self._id = None # session-id
self._error = None
self._init_event = Event()
self._q = Queue()
- self._connected = False # to be set/cleared by subclass
+ self._connected = False # to be set/cleared by subclass implementation
def _post_connect(self):
# start the subclass' main loop
+ listener = HelloListener(self)
+ self.add_listener(listener)
self.start()
# queue client's hello message for sending
self.send(content.Hello.build(self._client_capabilities))
- # we expect server's hello message, wait for _init_event to be set by HelloListener
+ # we expect server's hello message, wait for _init_event to be set
self._init_event.wait()
+ self.remove_listener(listener)
# there may have been an error
if self._error:
self._close()
raise self._error
- def initialize(self, id, capabilities):
+ def hello(self, id, capabilities):
self._id, self._capabilities = id, Capabilities(capabilities)
self._init_event.set()
- def initialize_error(self, err):
+ def hello_error(self, err):
self._error = err
self._init_event.set()