Revision 8024f8b5
b/ncclient/listeners.py | ||
---|---|---|
16 | 16 |
from weakref import WeakValueDictionary |
17 | 17 |
|
18 | 18 |
import content |
19 |
from session import SessionCloseError |
|
19 | 20 |
|
20 | 21 |
logger = logging.getLogger('ncclient.listeners') |
21 | 22 |
|
22 |
session_listeners = {} |
|
23 |
################################################################################ |
|
24 |
|
|
25 |
session_listeners = WeakValueDictionary |
|
23 | 26 |
def session_listener_factory(session): |
24 | 27 |
try: |
25 | 28 |
return session_listeners[session] |
... | ... | |
27 | 30 |
session_listeners[session] = SessionListener() |
28 | 31 |
return session_listeners[session] |
29 | 32 |
|
30 |
class SessionListener(object):
|
|
33 |
class SessionListener: |
|
31 | 34 |
|
32 | 35 |
def __init__(self): |
33 | 36 |
self._id2rpc = WeakValueDictionary() |
... | ... | |
37 | 40 |
def __str__(self): |
38 | 41 |
return 'SessionListener' |
39 | 42 |
|
40 |
|
|
41 |
|
|
42 | 43 |
def expect_close(self): |
43 | 44 |
self._expecting_close = True |
44 | 45 |
|
... | ... | |
60 | 61 |
logger.warning(e) |
61 | 62 |
|
62 | 63 |
def error(self, err): |
63 |
from ssh import SessionCloseError |
|
64 | 64 |
if err is SessionCloseError: |
65 |
logger.debug('received session close, expecting_close=%s' %
|
|
65 |
logger.debug('session closed by remote endpoint, expecting_close=%s' %
|
|
66 | 66 |
self._expecting_close) |
67 | 67 |
if not self._expecting_close: |
68 | 68 |
raise err |
69 | 69 |
|
70 |
################################################################################ |
|
70 | 71 |
|
71 | 72 |
class HelloListener: |
72 | 73 |
|
... | ... | |
76 | 77 |
def __init__(self, session): |
77 | 78 |
self._session = session |
78 | 79 |
|
80 |
### Events |
|
81 |
|
|
79 | 82 |
def reply(self, data): |
80 | 83 |
try: |
81 | 84 |
id, capabilities = content.Hello.parse(data) |
... | ... | |
87 | 90 |
def error(self, err): |
88 | 91 |
self._session.initialize_error(err) |
89 | 92 |
|
93 |
################################################################################ |
|
90 | 94 |
|
91 | 95 |
class DebugListener: |
92 |
|
|
93 |
def __str__(self): |
|
94 |
return 'DebugListener' |
|
95 |
|
|
96 |
def reply(self, raw): |
|
97 |
logger.debug('DebugListener:reply:\n%s' % raw) |
|
98 |
|
|
99 |
def error(self, err): |
|
100 |
logger.debug('DebugListener:error:\n%s' % err) |
|
96 |
def __str__(self): return 'DebugListener' |
|
97 |
def reply(self, raw): logger.debug('DebugListener:reply:\n%s' % raw) |
|
98 |
def error(self, err): logger.debug('DebugListener:error:\n%s' % err) |
b/ncclient/session.py | ||
---|---|---|
19 | 19 |
import content |
20 | 20 |
from capabilities import Capabilities, CAPABILITIES |
21 | 21 |
from error import ClientError |
22 |
from listeners import HelloListener |
|
22 | 23 |
from subject import Subject |
23 | 24 |
|
24 | 25 |
logger = logging.getLogger('ncclient.session') |
... | ... | |
29 | 30 |
|
30 | 31 |
def __init__(self): |
31 | 32 |
Thread.__init__(self, name='session') |
32 |
Subject.__init__(self, listeners=[HelloListener(self)])
|
|
33 |
Subject.__init__(self) |
|
33 | 34 |
self._client_capabilities = CAPABILITIES |
34 | 35 |
self._server_capabilities = None # yet |
35 | 36 |
self._id = None # session-id |
36 | 37 |
self._error = None |
37 | 38 |
self._init_event = Event() |
38 | 39 |
self._q = Queue() |
39 |
self._connected = False # to be set/cleared by subclass |
|
40 |
self._connected = False # to be set/cleared by subclass implementation
|
|
40 | 41 |
|
41 | 42 |
def _post_connect(self): |
42 | 43 |
# start the subclass' main loop |
44 |
listener = HelloListener(self) |
|
45 |
self.add_listener(listener) |
|
43 | 46 |
self.start() |
44 | 47 |
# queue client's hello message for sending |
45 | 48 |
self.send(content.Hello.build(self._client_capabilities)) |
46 |
# we expect server's hello message, wait for _init_event to be set by HelloListener
|
|
49 |
# we expect server's hello message, wait for _init_event to be set |
|
47 | 50 |
self._init_event.wait() |
51 |
self.remove_listener(listener) |
|
48 | 52 |
# there may have been an error |
49 | 53 |
if self._error: |
50 | 54 |
self._close() |
51 | 55 |
raise self._error |
52 | 56 |
|
53 |
def initialize(self, id, capabilities):
|
|
57 |
def hello(self, id, capabilities):
|
|
54 | 58 |
self._id, self._capabilities = id, Capabilities(capabilities) |
55 | 59 |
self._init_event.set() |
56 | 60 |
|
57 |
def initialize_error(self, err):
|
|
61 |
def hello_error(self, err):
|
|
58 | 62 |
self._error = err |
59 | 63 |
self._init_event.set() |
60 | 64 |
|
Also available in: Unified diff